2012-06-20 10 views
34

Detail Fehler:wenn ich Mockito Testlauf auftritt WrongTypeOfReturnValue Ausnahme

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 können, bin ich when auf updateItemAttributes Aufruf (das ist ein boolean zurückkehrt) nicht auf updateItemAttributesByJuId.

  1. Warum versucht Mockito eine boolean von updateItemAttributesByJuId zurückzukehren?
  2. Wie kann dies behoben werden?

Antwort

79

Nach https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90, sollten Sie Ihren

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

zu

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

Tks, ich mag das, dann funktioniert es gut –

+10

@confusedwindbell Betrachten Sie die Antwort als akzeptiert, wenn es Ihr Problem gelöst. –

+0

Ich hatte einen ähnlichen Fehler und diese Lösung funktioniert für mich. – YLombardi

20

Ein weiterer Grund für ähnliche Fehlermeldung anders formulieren versucht, eine final Methode zu verspotten. Man sollte nicht versuchen, finale Methoden zu verspotten (siehe Final method mocking).

Ich habe auch den Fehler in einem Multithreading-Test konfrontiert. Antwort von gna hat in diesem Fall funktioniert.

+0

löste meinen Fall [+1] –

1

Wenn Sie Anmerkungen verwenden, müssen Sie möglicherweise @Mock anstelle von @InjectMocks verwenden. Weil @InjectMocks zusammen als @Spy und @Mock funktioniert. Und @Spy verfolgt kürzlich ausgeführte Methoden und Sie können das Gefühl haben, dass falsche Daten zurückgegeben/substrahiert werden.

+1

"' @ InjectMocks 'funktioniert als' @ Spy' und '@ Mock' zusammen." <- das scheint mir falsch zu sein. Woher hast du das gehört? –

2

Ich hatte dieses Problem vor kurzem. Das Problem war, dass die Methode, die ich versuchte zu verspotten, keinen Zugriffsmodifikator hatte. Durch das Hinzufügen von Nutzern wurde das Problem gelöst.

2

In meinem Fall wurde das Problem verursacht, indem versucht wurde, eine statische Methode zu verspotten und mockStatic auf der Klasse zu vergessen. Auch vergaß ich die Klasse in die @PrepareForTest()

0

aufzunehmen ich diesen Fehler hat, weil in meinem Test hatte ich zwei Erwartungen, eine auf einem Mock und eine auf konkreten Typ

MyClass cls = new MyClass(); 
MyClass cls2 = Mockito.mock(Myclass.class); 
when(foo.bar(cls)).thenReturn(); 
when(foo.baz(cls2)).thenReturn(); 

ich es fest durch cls Wechsel zu auch ein Mock sein

Verwandte Themen