Mein Code ist wie folgt:
@RunWith(MockitoJUnitRunner.class)
public class MyClass {
private static final String code ="Test";
@Mock
private MyClassDAO dao;
@InjectMocks
private MyClassService Service = new MyClassServiceImpl();
@Test
public void testDoSearch() throws Exception {
final String METHOD_NAME = logger.getName().concat(".testDoSearchEcRcfInspections()");
CriteriaDTO dto = new CriteriaDTO();
dto.setCode(code);
inspectionService.searchEcRcfInspections(dto);
List<SearchCriteriaDTO> summaryList = new ArrayList<SearchCriteriaDTO>();
inspectionsSummaryList.add(dto);
when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);//got error in this line
verify(dao).doSearchInspections(dto);
}
}
Ich komme unter die Ausnahme
org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected in test class: Test Clean & maintainable test code requires zero unnecessary code. Following stubbings are unnecessary (click to navigate to relevant line of code): 1. -> at service.Test.testDoSearch(Test.java:72) Please remove unnecessary stubbings or use 'silent' option. More info: javadoc for UnnecessaryStubbingException class. at org.mockito.internal.exceptions.Reporter.formatUnncessaryStubbingException(Reporter.java:838) at org.mockito.internal.junit.UnnecessaryStubbingsReporter.validateUnusedStubs(UnnecessaryStubbingsReporter.java:34) at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:49) at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:103) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Bitte helfen Sie mir bei der Lösung
@RunWith(MockitoJUnitRunner.Silent.class)
und nicht still@RunWith(MockitoJUnitRunner.Silent::class)
Zuerst sollten Sie Ihre Testlogik überprüfen. Normalerweise gibt es 3 Fälle. Erstens verspotten Sie eine falsche Methode (Sie haben einen Tippfehler gemacht oder jemand hat den getesteten Code geändert, sodass die verspottete Methode nicht mehr verwendet wird). Zweitens schlägt Ihr Test fehl, bevor diese Methode aufgerufen wird. Drittens ist Ihre Logik falsch, wenn / switch irgendwo im Code verzweigt, so dass die verspottete Methode nicht aufgerufen wird.
Wenn dies der erste Fall ist, möchten Sie immer die verspottete Methode für die im Code verwendete ändern. Beim zweiten und dritten kommt es darauf an. Normalerweise sollten Sie dieses Modell einfach löschen, wenn es keine Verwendung hat. Manchmal gibt es jedoch bestimmte Fälle bei parametrisierten Tests, die diesen anderen Weg einschlagen oder früher fehlschlagen sollten. Dann können Sie diesen Test in zwei oder mehr separate Tests aufteilen, aber das sieht nicht immer gut aus. 3 Testmethoden mit möglicherweise 3 Argumenten, mit denen Anbieter testen können, lassen Sie unlesbar aussehen. In diesem Fall können Sie diese Ausnahme für JUnit 4 entweder stumm schalten
Anmerkung oder wenn Sie den Regelansatz verwenden
oder (das gleiche Verhalten)
Für JUnit 5-Tests können Sie diese Ausnahme mithilfe der im
mockito-junit-jupiter
Paket enthaltenen Anmerkungen stumm schalten.quelle
Mockito.lenient().when(...)
Folgendes verwenden: für diese spezielle Frage wäre esMockito.lenient().when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);
Lautlos ist keine Lösung. Sie müssen Ihr Modell in Ihrem Test reparieren. Siehe offizielle Dokumentation hier .
Unnötige Stubs sind gestubbte Methodenaufrufe, die während der Testausführung nie realisiert wurden (siehe auch MockitoHint). Beispiel:
Beachten Sie, dass eine der Stubbed-Methoden während der Testausführung im zu testenden Code nie realisiert wurde. Das Streu-Stubbing kann ein Versehen des Entwicklers, das Artefakt des Kopierens und Einfügens oder der Effekt sein, der den Test / Code nicht versteht. In beiden Fällen erhält der Entwickler unnötigen Testcode. Um die Codebasis sauber und wartbar zu halten, muss unnötiger Code entfernt werden. Ansonsten sind Tests schwerer zu lesen und zu begründen.
Weitere Informationen zum Erkennen nicht verwendeter Stichleitungen finden Sie unter MockitoHint.
quelle
Für mich weder das
@Rule
noch das@RunWith(MockitoJUnitRunner.Silent.class)
Vorschläge funktioniert. Es war ein Legacy-Projekt, bei dem wir ein Upgrade auf Mockito-Core 2.23.0 durchgeführt haben.Wir könnten das loswerden,
UnnecessaryStubbingException
indem wir :anstatt:
Unnötig zu erwähnen, dass Sie sich lieber den Testcode ansehen sollten, aber wir mussten zuerst das Zeug kompilieren und die Tests ausführen;)
quelle
Das
when
hier konfiguriert Ihren Mock, um etwas zu tun. Sie verwenden dieses Modell jedoch nach dieser Zeile in keiner Weise mehr (abgesehen von averify
). Mockito warnt Sie, dass diewhen
Linie daher sinnlos ist. Vielleicht haben Sie einen logischen Fehler gemacht?quelle
Service
) auf, um festzustellen, ob sie richtig reagiert. Das hast du überhaupt nicht gemacht, also was testest du hier?Wenn Sie sich einen Teil Ihrer Stapelspur ansehen, sieht es so aus, als würden Sie die
dao.doSearch()
Stelle anderswo stubben . Eher wie das wiederholte Erstellen der Stubs derselben Methode.Betrachten Sie zum Beispiel die folgende Testklasse:
Ich würde lieber in Betracht ziehen, Ihre Tests zu überarbeiten, um sie bei Bedarf zu stoppen.
quelle
Wenn Sie stattdessen diesen Stil verwenden:
Ersetzen Sie es durch:
quelle
Ich hatte,
UnnecessaryStubbingException
als ich versuchte, diewhen
Methoden auf ein Spy-Objekt anzuwenden.Mockito.lenient()
Die Ausnahme wurde zum Schweigen gebracht, aber die Testergebnisse waren nicht korrekt.Bei Spy-Objekten muss man die Methoden direkt aufrufen.
quelle
In meinem Fall sagte mir der Mockito-Fehler, ich solle die eigentliche Methode nach dem
when
oder aufrufenwhenever
stub . Da wir uns nicht auf die Bedingungen beriefen, die wir gerade verspottet hatten, meldete Mockito dies als unnötige Stubs oder Code.So war es, als der Fehler kam:
dann habe ich gerade die in der when-Anweisung erwähnte Methode aufgerufen, um die Methode zu verspotten.
Die vorgenommenen Änderungen sind wie folgt
stockViewModelTest.getStockAvailability(listOf(), getStocksApiCallBack)
es funktioniert jetzt.
quelle
Ersetzen
@RunWith(MockitoJUnitRunner.class)
mit
@RunWith(MockitoJUnitRunner.Silent.class)
oder entfernen
@RunWith(MockitoJUnitRunner.class)
oder kommentieren Sie einfach die unerwünschten Spottanrufe aus (angezeigt als nicht autorisiertes Stubbing).
quelle
Bei einem großen Projekt ist es schwierig, jede dieser Ausnahmen zu beheben. Zur gleichen Zeit mit
Silent
nicht empfohlen. Ich habe ein Skript geschrieben, um alle unnötigen Stubbings zu entfernen, die eine Liste von ihnen enthalten.https://gist.github.com/cueo/da1ca49e92679ac49f808c7ef594e75b
Wir müssen nur die
mvn
Ausgabe kopieren und einfügen und die Liste dieser Ausnahmen mit Regex schreiben und das Skript den Rest erledigen lassen.quelle
Wenn Sie beim Verspotten any () verwenden, müssen Sie @RunWith (MockitoJUnitRunner.class) mit @RunWith (MockitoJUnitRunner.Silent.class) neu platzieren.
quelle
Wenn Sie ein Modell erstellen und dieses Modell nicht verwendet wird, wird eine nicht verwendete Stubbing-Ausnahme ausgelöst. In Ihrem Fall wird dieser Schein nicht wirklich genannt. Daher wird dieser Fehler ausgelöst. Daher relpace,
@RunWith(MockitoJUnitRunner.class)
mit@RunWith(MockitoJUnitRunner.Silent.class)
dem der Fehler behoben werden würde. Wenn Sie weiterhin verwenden möchten,@RunWith(MockitoJUnitRunner.class)
versuchen Sie, Ihre Logik zu debuggen, ob die von Ihnen verspottete Funktion tatsächlich aufgerufen wird oder nicht.quelle