web-dev-qa-db-fra.com

lorsque je lance le test mockito survient une exception WrongTypeOfReturnValue

Détail de l'erreur:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Boolean cannot be returned by updateItemAttributesByJuId()
updateItemAttributesByJuId() should return ResultRich
This exception might occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.

mon code:

@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;

when(arrangeManagerSpy
    .updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
    .thenReturn(false);

Comme vous pouvez le constater, j'appelle when sur updateItemAttributes (qui renvoie un boolean) et non sur updateItemAttributesByJuId

  1. Pourquoi Mockito tente-t-il de renvoyer une boolean à partir de updateItemAttributesByJuId
  2. Comment cela peut-il être corrigé?
58
confused windbell

Selon https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90 , vous devez reformuler votre 

when(bar.getFoo()).thenReturn(fooBar)

à

doReturn(fooBar).when(bar).getFoo()
125
gna

Une autre raison pour un message d'erreur similaire est de tenter de simuler une méthode final. Il ne faut pas essayer de se moquer des méthodes finales (voir La méthode finale se moque ).

J'ai également confronté l'erreur dans un test multi-thread. Réponse de gna a travaillé dans ce cas.

27
Arvidaa

J'ai eu récemment ce problème. Le problème était que la méthode que je tentais de simuler ne comportait aucun modificateur d'accès. L'ajout du public a résolu le problème.

4
not_john

Problème très intéressé . Dans mon cas, ce problème est survenu lorsque j'ai tenté de déboguer mes tests sur cette ligne similaire:

Boolean fooBar;
when(bar.getFoo()).thenReturn(fooBar);

La note importante est que les tests s’exécutaient correctement sans débogage.

En tout cas, quand j'ai remplacé le code ci-dessus par l'extrait de code ci-dessous, j'ai pu déboguer la ligne posant problème sans problèmes.

doReturn(fooBar).when(bar).getFoo();
4
Luke

Dans mon cas, le problème était dû à une simulation de méthode statique et à l’oubli d’appeler mockStatic sur la classe. Aussi j'ai oublié d'inclure la classe dans la @PrepareForTest()

3
ACV

J'ai eu cette erreur parce que dans mon test j'avais deux attentes, une sur une maquette et une sur le type concret

MyClass cls = new MyClass();
MyClass cls2 = Mockito.mock(Myclass.class);
when(foo.bar(cls)).thenReturn(); // cls is not actually a mock
when(foo.baz(cls2)).thenReturn();

Je l'ai corrigé en changeant les clés pour être une maquette aussi

2
Tzafrir

Si vous utilisez des annotations, vous devrez peut-être utiliser @Mock au lieu de @InjectMocks. Parce que @InjectMocks fonctionne en tant que @Spy et @Mock ensemble. Et @Spy conserve une trace des méthodes récemment exécutées et vous pouvez avoir l’impression que des données incorrectes sont renvoyées/sous-lit.

1
dillip pattnaik

Pour moi, cela signifiait que je courais ceci:

a = Mockito.mock(SomeClass.class);
b = new RealClass();
when(b.method1(a)).thenReturn(c); 
// within this method1, it calls param1.method2() -- note, b is not a spy or mock

Donc, ce qui se passait, c’est que mockito détectait que a.method2() était appelé et me disait que je ne pouvais pas retourner c de a.method2(), ce qui est faux. 

Solution: utilisez la syntaxe de style doReturn(c).when(b).method1(a) (au lieu de when(b.method1(a)).thenReturn(c);), qui vous aidera à découvrir le bogue caché de manière plus concise et plus rapide. 

Ou dans ce cas particulier, après cela, il a commencé à afficher une "exception NotAMockException" plus précise, et je l'ai modifiée pour ne plus essayer de définir une valeur de retour à partir d'un objet non simulé.

1
rogerdpack

J'ai eu un problème similaire où les tests échouaient lors du débogage dans IntelliJ en raison de problèmes liés à la méthode toString (), mais passaient sans succès. Utiliser la réponse de @gna a fonctionné, mais aussi dans mon cas, le fait de passer une variable plutôt que de créer un nouvel objet dans la méthode thenReturn a résolu le problème.

Donc convertir

when(bar.getFoo()).thenReturn(new fooBar())

à :

FooBar fooBar = new FooBar();
when(bar.getFoo()).thenReturn(fooBar);

résolu le problème.

0
Grant Lay

Dans mon cas, j'utilisais à la fois @RunWith(MockitoJUnitRunner.class) et MockitoAnnotations.initMocks(this). Quand j'ai enlevé MockitoAnnotations.initMocks(this) cela a fonctionné correctement.

0
ihebiheb

Erreur:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
La chaîne ne peut pas être retournée par size ()
taille () devrait retourner int
***
Si vous ne savez pas pourquoi vous obtenez l'erreur ci-dessus, lisez la suite.
En raison de la nature de la syntaxe ci-dessus, un problème peut survenir pour les raisons suivantes:
1. Cette exception pourrait se produire dans un multi-thread mal écrit
tests.
Veuillez consulter Mockito FAQ sur les limitations du test de simultanéité.
2. Un espion est stubé en utilisant la syntaxe when (spy.foo ()). Then (). Il est plus sûr de
espions tronqués -
- avec la famille de méthodes doReturn | Throw (). Plus dans les javadocs pour
Méthode Mockito.spy (). 

Code actuel:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Object.class, ByteString.class})

@Mock
private ByteString mockByteString;

String testData = “dsfgdshf”;
PowerMockito.when(mockByteString.toStringUtf8()).thenReturn(testData); 
// throws above given exception

Solution pour résoudre ce problème:

1er Supprimer l'annotation “@Mock”.

private ByteString mockByteString;

2e ajouter PowerMockito.mock

mockByteString = PowerMockito.mock(ByteString.class);

@MockBean manquant sur le haricot que vous voulez simuler

0
buddha

J'ai récemment rencontré ce problème en moquant une fonction dans une classe de données Kotlin. Pour une raison inconnue, l'un de mes tests a été gelé. Lorsque j'ai relancé les tests, certains de mes tests précédemment passés ont échoué avec l'exception WrongTypeOfReturnValue.

Je me suis assuré que j'utilisais org.mockito:mockito-inline pour éviter les problèmes avec les classes finales (mentionnées par Arvidaa), mais le problème est resté. Ce qui a résolu le problème pour moi a été de tuer le processus et redémarrer Android Studio. Cela a mis fin à mon test de test gelé et les tests suivants se sont déroulés sans problèmes.

0
simonevertsson

C'est mon cas:

//given
ObjectA a = new ObjectA();
ObjectB b = mock(ObjectB.class);
when(b.call()).thenReturn(a);

Target target = spy(new Target());
doReturn(b).when(target).method1();

//when
String result = target.method2();

Puis j'obtiens cette erreur:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
ObjectB$$EnhancerByMockitoWithCGLIB$$2eaf7d1d cannot be returned by method2()
method2() should return String

Peux-tu deviner?

Le problème est que Target.method1 () est une méthode statique. Mockito me met complètement en garde contre une autre chose.

0
Surasin Tancharoen