Szczegóły błędu:
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
(co nie zwracają boolean
) nie na updateItemAttributesByJuId
.
- Dlaczego Mockito próbuje zwrócić
boolean
odupdateItemAttributesByJuId
? - Jak można to naprawić?
@Repository
metody Spring DAO z @Aspect . jeśli to zrobięwhen(someDao.someMethod()).thenReturn(List<xxx>)
, mam ten wyjątek WrongTypeOfReturnValue. Poprzez debugowanie widzę, żesomeMethod
metoda została faktycznie wywołana w powyższej instrukcji i wyzwala pomoc w zakresienull
okrążenia i zwraca, ale Mockito oczekujeList<xxx>
.Innym powodem podobnego komunikatu o błędzie jest próba sfałszowania
final
metody. Nie należy próbować kpić z metod końcowych (patrz Mockowanie metod końcowych ).Zmierzyłem się również z błędem w teście wielowątkowym. Odpowiedź przez gna zadziałała w tym przypadku.
źródło
Bardzo ciekawy problem. W moim przypadku ten problem był spowodowany, gdy próbowałem debugować moje testy w tej podobnej linii:
Ważną informacją jest to, że testy działały poprawnie bez debugowania.
W każdym razie, kiedy zamieniłem powyższy kod na poniższy fragment kodu, mogłem bez problemu zdebugować problem.
źródło
Dla mnie oznaczało to, że prowadziłem to:
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
Więc co się dzieje, jest to, że Mockito było wykrycie, że
a.method2()
był nazywany, i mówi mi, że nie może wrócićc
za.method2()
co jest źle.Poprawka: użyj
doReturn(c).when(b).method1(a)
składni stylu (zamiastwhen(b.method1(a)).thenReturn(c);
), która pomoże ci odkryć ukryty błąd bardziej zwięźle i szybciej.Lub w tym konkretnym przypadku, po wykonaniu tej czynności, zaczął pokazywać dokładniejszy „NotAMockException” i zmieniłem go, aby nie próbował już ustawiać wartości zwracanej z obiektu niebędącego makietą.
źródło
Niedawno miałem ten problem. Problem polegał na tym, że metoda, którą próbowałem wyszydzić, nie miała modyfikatora dostępu. Dodanie publicznego rozwiązało problem.
źródło
Miałem ten błąd, ponieważ w moim teście miałem dwa oczekiwania, jedno na próbę, a drugie na konkretny 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();
Naprawiłem to, zmieniając cls, aby były również próbą
źródło
W moim przypadku problem był spowodowany próbą wyszydzenia metody statycznej i zapomnieniem wywołania
mockStatic
klasy. Zapomniałem też o dołączeniu tej klasy do@PrepareForTest()
źródło
Jeśli używasz adnotacji, może być konieczne użycie @Mock zamiast @InjectMocks. Ponieważ @InjectMocks działa razem jako @Spy i @Mock. @Spy śledzi ostatnio wykonane metody i możesz odnieść wrażenie, że zwracane są nieprawidłowe dane.
źródło
@InjectMocks
działa jako@Spy
i@Mock
razem”. <- to wydaje mi się złe. Skąd o tym słyszałeś?W moim przypadku używałem obu
@RunWith(MockitoJUnitRunner.class)
iMockitoAnnotations.initMocks(this)
. Po usunięciuMockitoAnnotations.initMocks(this)
działało poprawnie.źródło
Błąd:
Rzeczywisty kod:
@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
Rozwiązanie, aby rozwiązać ten problem:
1. Usuń adnotację „@Mock”.
private ByteString mockByteString;
2nd Add
PowerMockito.mock
źródło
Niedawno napotkałem ten problem podczas mockowania funkcji w klasie danych Kotlin . Z jakiegoś nieznanego powodu jeden z moich przebiegów testowych zakończył się zawieszeniem. Kiedy ponownie przeprowadziłem testy, niektóre z moich testów, które wcześniej przeszły, zaczęły kończyć się niepowodzeniem z
WrongTypeOfReturnValue
wyjątkiem.org.mockito:mockito-inline
Upewniłem się, że używam, aby uniknąć problemów z końcowymi zajęciami (o których wspomniał Arvidaa), ale problem pozostał. Rozwiązaniem dla mnie było zabicie procesu i ponowne uruchomienie Android Studio . To zakończyło mój zamrożony przebieg testowy, a kolejne przebiegi testowe przeszły bez problemów.źródło
Brak @MockBean w fasoli, którą chcesz wyszydzić
źródło
Mam ten problem,
WrongTypeOfReturnValue
ponieważ wyszydziłem metodę zwracającą ajava.util.Optional;
zcom.google.common.base.Optional;
powodu automatycznego dodawania brakujących importów przez program formatujący.Mockito właśnie powiedział mi, że „metoda coś () powinna zwrócić Opcjonalne” ...
źródło
W moim przypadku fasola została zainicjowana przy użyciu adnotacji @Autowired zamiast @MockBean
W ten sposób kpiny z DAO i usług rzucają taki wyjątek
źródło
Dla mnie problemem były testy wielowątkowe, które wykonywały stubbing / weryfikację na udostępnionych makietach. Doprowadziło to do losowego wyrzucenia
WrongTypeOfReturnValue
wyjątku.To nie jest poprawnie napisany test przy użyciu Mockito. Nie należy uzyskiwać dostępu do makiet z wielu wątków.
Rozwiązaniem było stworzenie makiet lokalnych dla każdego testu.
źródło
TL; DR Jeśli niektóre argumenty w twoim teście są
null
, pamiętaj, aby mockować wywołanie parametru za pomocąisNull()
zamiastanyXXX()
.Otrzymałem ten błąd podczas aktualizacji z Spring boot 1.5.x do 2.1.x. Spring boot jest dostarczany z własnym Mockito, które jest teraz również zaktualizowane do 2.x (patrz np. Zależności Spring boot 2.1.2 )
Mockito zmienił zachowanie dla
anyXXX()
sposobu, gdzieXXX
jestString
,Long
itp Oto javadoc zanyLong()
:Sugerowałbym debugowanie do punktu, w którym twój makieta ma zostać wywołany i sprawdzenie, czy przynajmniej jeden argument jest
null
. W takim przypadku upewnij się, że przygotowujesz makietęisNull()
zamiast npanyLong()
.Więc to:
staje się:
źródło
To jest moja sprawa:
//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();
Wtedy pojawia się ten błąd:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue: ObjectB$$EnhancerByMockitoWithCGLIB$$2eaf7d1d cannot be returned by method2() method2() should return String
Czy możesz zgadnąć?
Problem polega na tym, że Target.method1 () jest metodą statyczną. Mockito całkowicie ostrzega mnie przed inną rzeczą.
źródło