Wenn ich den Mockito-Test ausführe, tritt eine WrongTypeOfReturnValue-Ausnahme auf

Lesezeit: 4 Minuten

Benutzer-Avatar
verwirrte Windglocke

Fehlerdetail:

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.

mein Code:

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

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

Wie Sie sehen, rufe ich an when an updateItemAttributes (was eine zurückgibt boolean) nicht auf updateItemAttributesByJuId.

  1. Warum versucht Mockito, a zurückzugeben boolean aus updateItemAttributesByJuId?
  2. Wie kann dies behoben werden?

Benutzer-Avatar
gna

Entsprechend https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90sollten Sie Ihre umformulieren

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

zu

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

  • Das ist ein toller Tipp. Ich hatte dieses Problem auch beim Testen von Spring @Repository DAO-Methode mit @Aspekt. wenn ich mache when(someDao.someMethod()).thenReturn(List<xxx>), habe ich diese WrongTypeOfReturnValue-Ausnahme. Durch Debug kann ich sehen, dass die someMethod Die Methode wurde tatsächlich in der obigen Anweisung aufgerufen und löst den Around Advice aus und gibt a zurück null aber Mockito erwartet a List<xxx>.

    – Leon – Han Li

    1. April 2016 um 22:06 Uhr


  • Hat bei mir geklappt. Obrigado!

    – Saxophonist

    10. März 2020 um 14:00 Uhr

  • Ausgezeichnete Antwort. Es hat meinen Tag gerettet.

    – Benutzer3198259

    2. September 2020 um 11:56 Uhr

  • Was ist, wenn die Methode verspottet werden soll static?

    – paradocslover

    1. Mai 2021 um 0:49 Uhr

  • @paradocslover im Falle von Statik denke ich, dass Sie Powermockt Powermock.mockStatic(foo.class) und dann PowerMockito.when(Foo.class, “method”, …params).thenReturn(bar) verwenden müssen

    – Rodrigo Borba

    7. Juni 2021 um 20:58 Uhr

Ein weiterer Grund für eine ähnliche Fehlermeldung ist der Versuch, einen zu verspotten final Methode. Man sollte nicht versuchen, Final-Methoden zu verspotten (siehe Final-Methoden verspotten).

Ich habe den Fehler auch in einem Multithread-Test konfrontiert. Answer by gna hat in dem Fall funktioniert.

Sehr interessantes Problem. In meinem Fall wurde dieses Problem verursacht, als ich versuchte, meine Tests in dieser ähnlichen Zeile zu debuggen:

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

Der wichtige Hinweis ist, dass die Tests ohne Debugging korrekt ausgeführt wurden.

In jedem Fall konnte ich die Problemzeile ohne Probleme debuggen, als ich den obigen Code durch den folgenden Codeausschnitt ersetzte.

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

  • Danke, es sieht so aus, als ob es das gleiche Problem mit Kotlin-Datenklassen wie Feldern gibt, und Ihre Lösung hat es gelöst!

    – Mohsen Mirhoseini

    15. August 2018 um 17:56 Uhr

  • Danke, ich hatte das gleiche Problem mit Kotlin und Android

    – Arlind

    3. Februar um 21:59 Uhr

  • Danke, das hat bei der Behebung von Debugging-Problemen geholfen!

    – android_dev

    13. April um 16:35 Uhr

  • Ich bekam “Argument übergeben an when() is not a mock!” Fehler nach oben genannter Änderung.

    – dkm007

    8. Juni um 11:56

Benutzer-Avatar
rogerpack

Für mich bedeutete dies, dass ich Folgendes ausführte:

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

Was also passiert ist, ist, dass Mockito das entdeckt hat a.method2() wurde angerufen und sagte mir, ich könne nicht zurückkehren c aus a.method2() was falsch ist.

Lösung: Verwenden Sie die doReturn(c).when(b).method1(a) style-Syntax (statt when(b.method1(a)).thenReturn(c);), die Ihnen hilft, den versteckten Fehler präziser und schneller zu entdecken.

Oder in diesem speziellen Fall, nachdem es das genauere “NotAMockException” angezeigt hat, und ich es geändert habe, um nicht länger zu versuchen, einen Rückgabewert von einem Nicht-Mock-Objekt festzulegen.

Ich hatte dieses Problem kürzlich. Das Problem war, dass die Methode, die ich verspotten wollte, keinen Zugriffsmodifikator hatte. Das Hinzufügen von public löste das Problem.

Ich hatte diesen Fehler, weil ich in meinem Test zwei Erwartungen hatte, eine an einen Schein und eine an einen konkreten Typ

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();

Ich habe es behoben, indem ich cls geändert habe, um auch ein Schein zu sein

In meinem Fall wurde das Problem dadurch verursacht, dass versucht wurde, eine statische Methode zu verspotten und zu vergessen, sie aufzurufen mockStatic auf die Klasse. Außerdem habe ich vergessen, die Klasse in die einzufügen @PrepareForTest()

1330110cookie-checkWenn ich den Mockito-Test ausführe, tritt eine WrongTypeOfReturnValue-Ausnahme auf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy