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 können, rufe ich when
an updateItemAttributes
(was a zurückgibt boolean
), nicht an updateItemAttributesByJuId
.
- Warum versucht Mockito, einen
boolean
von zurückzugebenupdateItemAttributesByJuId
? - Wie kann dies behoben werden?
@Repository
DAO-Methode mit @Aspect . Wenn ich das tuewhen(someDao.someMethod()).thenReturn(List<xxx>)
, habe ich diese WrongTypeOfReturnValue-Ausnahme. Durch das Debuggen kann ich sehen, dass diesomeMethod
Methode in der obigen Anweisung tatsächlich aufgerufen wurde und den Around Advice auslöst und anull
zurückgibt, aber Mockito erwartet aList<xxx>
.Ein weiterer Grund für eine ähnliche Fehlermeldung ist der Versuch, eine
final
Methode zu verspotten . Man sollte nicht versuchen, endgültige Methoden zu verspotten (siehe Verspotten der endgültigen Methode ).Ich habe den Fehler auch in einem Multithread-Test konfrontiert. Die Antwort von gna hat in diesem Fall funktioniert.
quelle
Sehr interessiertes Problem. In meinem Fall wurde dieses Problem verursacht, als ich versuchte, meine Tests in dieser ähnlichen Zeile zu debuggen:
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 Code-Snippet ersetzte.
quelle
Ich hatte vor kurzem dieses Problem. Das Problem war, dass die Methode, die ich verspotten wollte, keinen Zugriffsmodifikator hatte. Das Hinzufügen von public löste das Problem.
quelle
Für mich bedeutete dies, dass ich Folgendes ausführte:
Also , was passiert war , dass Mockito ist wurde erfasst wird, dass
a.method2()
genannt wurde, und mir zu sagen , ich nicht zurückkehren konntec
ausa.method2()
dem falsch ist.Fix: Verwenden Sie die
doReturn(c).when(b).method1(a)
Stilsyntax (anstelle vonwhen(b.method1(a)).thenReturn(c);
), um den versteckten Fehler präziser und schneller zu entdecken.In diesem speziellen Fall wurde danach die genauere "NotAMockException" angezeigt, und ich habe sie so geändert, dass nicht mehr versucht wird, einen Rückgabewert für ein nicht nachgebildetes Objekt festzulegen.
quelle
Ich hatte diesen Fehler, weil ich in meinem Test zwei Erwartungen hatte, eine an einen Schein und eine an einen konkreten Typ
Ich habe es behoben, indem ich cls so geändert habe, dass es auch ein Mock ist
quelle
In meinem Fall wurde das Problem durch den Versuch verursacht, eine statische Methode zu verspotten und zu vergessen,
mockStatic
die Klasse aufzurufen . Außerdem habe ich vergessen, die Klasse in die Klasse aufzunehmen@PrepareForTest()
quelle
Wenn Sie Anmerkungen verwenden, müssen Sie möglicherweise @Mock anstelle von @InjectMocks verwenden. Weil @InjectMocks als @Spy und @Mock zusammenarbeitet. Und @Spy verfolgt kürzlich ausgeführte Methoden und Sie haben möglicherweise das Gefühl, dass falsche Daten zurückgegeben / unterbettet werden.
quelle
@InjectMocks
arbeitet als@Spy
und@Mock
zusammen." <- das scheint mir falsch zu sein. Woher hast du das gehört?Fehlende @MockBean auf der Bean, die Sie verspotten möchten
quelle
In meinem Fall habe ich beide
@RunWith(MockitoJUnitRunner.class)
und verwendetMockitoAnnotations.initMocks(this)
. Als ich es entfernteMockitoAnnotations.initMocks(this)
, funktionierte es richtig.quelle
In meinem Fall wurde die Bean mit @Autowired Annotation anstelle von @MockBean initialisiert
Auf diese Weise löst das Verspotten von DAOs und Diensten eine solche Ausnahme aus
quelle
Error:
Aktueller Code:
Lösung zur Behebung dieses Problems:
1. Entfernen Sie die Anmerkung „@Mock“.
2. Hinzufügen
PowerMockito.mock
quelle
Ich bin kürzlich auf dieses Problem gestoßen, als ich eine Funktion in einer Kotlin-Datenklasse verspottet habe . Aus einem unbekannten Grund endete einer meiner Testläufe in einem eingefrorenen Zustand. Als ich die Tests erneut ausführte, schlugen einige meiner zuvor bestandenen Tests mit der
WrongTypeOfReturnValue
Ausnahme fehl .Ich stellte sicher, dass ich
org.mockito:mockito-inline
die Probleme mit den Abschlussklassen (von Arvidaa erwähnt) vermieden hatte, aber das Problem blieb bestehen. Was es für mich gelöst hat, war , den Prozess abzubrechen und Android Studio neu zu starten . Dies beendete meinen eingefrorenen Testlauf und die folgenden Testläufe wurden ohne Probleme bestanden.quelle
Ich habe dieses Problem erhalten,
WrongTypeOfReturnValue
weil ich eine Methode verspottet habe, die ajava.util.Optional;
mit acom.google.common.base.Optional;
zurückgibt, weil mein Formatierer automatisch fehlende Importe hinzugefügt hat.Mockito sagte mir nur, dass "Methode etwas () Optional zurückgeben sollte" ...
quelle
Für mich waren das Problem die Multithread-Tests, die Stubbing / Verifikation auf einem gemeinsam genutzten Mock durchführten. Es führte zu zufälligen
WrongTypeOfReturnValue
Ausnahmen.Dies ist kein ordnungsgemäß geschriebener Test mit Mockito. Auf Mocks sollte nicht über mehrere Threads zugegriffen werden.
Die Lösung bestand darin, für jeden Test lokale Verspottungen vorzunehmen.
quelle
TL; DR Wenn einige Argumente in Ihrem Test
null
vorliegen, verspotten Sie den Parameteraufruf mitisNull()
stattanyXXX()
.Ich habe diesen Fehler beim Upgrade von Spring Boot 1.5.x auf 2.1.x erhalten. Spring Boot wird mit einem eigenen Mockito ausgeliefert, der jetzt auch auf 2.x aktualisiert wird (siehe z. B. Abhängigkeiten von Spring Boot 2.1.2 ).
Mockito hat das Verhalten für die geänderte
anyXXX()
Methode, woXXX
istString
,Long
usw. Dies ist die javadoc vonanyLong()
:Ich würde vorschlagen, dass Sie bis zu dem Punkt debuggen, an dem Ihr Mock aufgerufen wird, und prüfen, ob mindestens ein Argument vorliegt
null
. Stellen Sie in diesem Fall sicher, dass Sie Ihren Mock mitisNull()
statt zanyLong()
.Also das:
wird:
quelle
Das ist mein Fall:
Dann bekomme ich diesen Fehler:
Können Sie erraten?
Das Problem ist, dass Target.method1 () eine statische Methode ist. Mockito warnt mich völlig vor einer anderen Sache.
quelle