2012-06-20 20 views
34

błędzie Szczegóły:kiedy uruchomić testy Mockito występuje WrongTypeOfReturnValue wyjątkiem

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. 

mój kod:

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

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

Jak widać, wzywam when na updateItemAttributes (która ma zwrócić boolean) nie na updateItemAttributesByJuId.

  1. Dlaczego Mockito próbując zwrócić boolean od updateItemAttributesByJuId?
  2. Jak można to naprawić?

Odpowiedz

79

Według https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90, należy przeformułować swoje

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

do

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

Tks, podoba mi się to, to działa dobrze –

+10

@confusedwindbell Rozważ zaznaczenie odpowiedzi jako zaakceptowanej, jeśli rozwiązało problem. –

+0

Miałem podobny błąd i to rozwiązanie działa dla mnie. – YLombardi

20

Innym powodem podobnym komunikatem o błędzie próbuje szydzić metodę final. Nie należy próbować kpić z ostatecznych metod (patrz Final method mocking).

Mam również do czynienia z błędem w teście wielowątkowym. Odpowiedź od Gna działała w tym przypadku.

+0

rozwiązał moją sprawę [+1] –

1

Jeśli używasz adnotacji, może być konieczne użycie @Mock zamiast @InjectMocks. Ponieważ @InjectMocks działa jako @Spy i @Mock razem. A @Spy śledzi ostatnio wykonane metody i możesz poczuć, że nieprawidłowe dane są zwracane/podporządkowane.

+1

"' @ InjectMocks' działa jako '@ Spy' i' @ Mock' razem. " <- wydaje mi się to złe. Skąd to słyszałeś? –

2

Niedawno miałem ten problem. Problem polegał na tym, że metoda, którą próbowałem sfałszować, nie miała modyfikatora dostępu. Dodanie publicznego rozwiązało problem.

2

W moim przypadku problem spowodowany był próbą wyśmiewania statycznej metody i zapomnienia połączenia z klasą pod numerem mockStatic. Również zapomniałem obejmują klasę do @PrepareForTest()

0

I ma ten błąd, ponieważ w moim teście miałem dwa oczekiwania, jeden na makiety i jeden na rodzaj betonu

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

Naprawiłem go zmieniając CLS do być również próbny

Powiązane problemy