Wie kann ich überprüfen, ob eine Methode nicht von der Abhängigkeit eines Objekts aufgerufen wird?
Zum Beispiel:
public interface Dependency {
void someMethod();
}
public class Foo {
public bar(final Dependency d) {
...
}
}
Mit dem Foo-Test:
public class FooTest {
@Test
public void dependencyIsNotCalled() {
final Foo foo = new Foo(...);
final Dependency dependency = mock(Dependency.class);
foo.bar(dependency);
**// verify here that someMethod was not called??**
}
}
never
ist die beste und spezifischste Methode. Wenn Sie jedoch ein gesamtes Scheinobjekt überprüfen müssen, sollten Sie auchverifyZeroInteractions(mockObject)
oder berücksichtigenverifyNoMoreInteractions(mockObject)
.verifyZeroInteractions
ist veraltet.verifyNoInteractions
ist das eine alternative vorgeschlagen. Die Mockito-Version zum Zeitpunkt dieses Kommentars ist 3.3.3Verwenden Sie das zweite Argument für die
Mockito.verify
Methode wie folgt:verify(dependency, Mockito.times(0)).someMethod()
quelle
never()
ist nicht wesentlich lesbarer alstimes(0)
. Aber die Existenz vonnever
erhöht die kognitive Belastung und erschwert das Verständnis und die Erinnerung an die Verwendung des Mockito-Systems. Mockito hätte also nichtnever
in die API aufgenommen werden sollen, es ist die mentalen Kosten nicht wert.someMethod
es 0 Mal aufgerufen wurde, oder überprüft es nur, dasssomeMethod
es nie mit Null-Argumenten aufgerufen wurde?someMethod
Argumente mit Null null Mal aufgerufen wurden - nicht verifiziert.Als allgemeineres Muster tendiere ich dazu,
@After
im Test einen Block zu verwenden :Dann ist der Test nur frei , um zu überprüfen , was sollte aufgerufen werden.
Außerdem stellte ich fest, dass ich oft vergessen hatte, nach "keine Interaktionen" zu suchen, um später festzustellen, dass Dinge aufgerufen wurden, die nicht hätten sein sollen.
Daher finde ich dieses Muster nützlich, um alle unerwarteten Anrufe abzufangen, die nicht speziell überprüft wurden.
quelle
verifyNoMoreInteractions
? Die anderen Antworten hier beruhen darauf, dass der Testschreiber ausdrücklich daran denkt, diese Prüfungen aufzulisten: Das ist in meinem Buch zu fehleranfällig.Zuallererst: Sie sollten immer mockito static importieren, damit der Code viel besser lesbar (und intuitiver) ist:
Es gibt tatsächlich viele Möglichkeiten, dies zu erreichen, aber es ist (wohl) sauberer, das zu verwenden
Methode für alle Tests, wenn Sie sie bei anderen Tests verwenden, um eine bestimmte Anzahl von Ausführungen wie folgt zu bestätigen:
Alternativen sind:
Alternativ - wenn Sie wirklich sicherstellen möchten, dass ein bestimmtes verspottetes Objekt überhaupt NICHT aufgerufen wird - können Sie Folgendes verwenden:
quelle
Sowohl die
verifyNoMoreInteractions()
als auch dieverifyZeroInteractions()
Methode haben intern dieselbe Implementierung wie:Daher können wir eines davon für ein Scheinobjekt oder ein Array von Scheinobjekten verwenden, um zu überprüfen, ob keine Methoden mit Scheinobjekten aufgerufen wurden.
quelle