Jak sprawdzić, czy metoda nie jest wywoływana w zależności od obiektu?
Na przykład:
public interface Dependency {
void someMethod();
}
public class Foo {
public bar(final Dependency d) {
...
}
}
Dzięki testowi Foo:
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
jest najlepszym i najbardziej konkretnym sposobem, ale jeśli chcesz sprawdzić cały próbny obiekt, rozważ równieżverifyZeroInteractions(mockObject)
lubverifyNoMoreInteractions(mockObject)
.verifyZeroInteractions
jest przestarzałe.verifyNoInteractions
jest sugerowaną alternatywą. Wersja Mockito w momencie komentarza to 3.3.3użyj drugiego argumentu
Mockito.verify
metody, jak w:verify(dependency, Mockito.times(0)).someMethod()
źródło
never()
nie jest znacznie bardziej czytelny niżtimes(0)
. Ale istnienienever
zwiększa obciążenie poznawcze i sprawia, że system mockito jest trudniejszy do zrozumienia i zapamiętania, jak go używać. Tak naprawdę mockito nie powinno było być zawartenever
w ich API, nie jest to warte kosztu psychicznego.someMethod
został wywołany 0 razy, czy tylko sprawdza, czysomeMethod
nigdy nie został wywołany z zerowymi argumentami?someMethod
z zerowymi argumentami nazywano zero razy - niezweryfikowane.Jako bardziej ogólny wzorzec do naśladowania, zwykle używam
@After
bloku w teście:Następnie test może zweryfikować tylko to, co należy nazwać.
Odkryłem również, że często zapominałem sprawdzać „brak interakcji”, ale później odkryłem, że nazywane są rzeczy, które nie powinny były być.
Uważam więc, że ten wzór jest przydatny do przechwytywania wszystkich nieoczekiwanych połączeń, które nie zostały specjalnie zweryfikowane.
źródło
verifyNoMoreInteractions
? Inne odpowiedzi tutaj polegają na pisarzu testów, który wyraźnie pamięta, aby wymienić te kontrole: to zbyt podatne na błędy w mojej książce.Po pierwsze: zawsze powinieneś importować mockito static, w ten sposób kod będzie znacznie bardziej czytelny (i intuicyjny):
Istnieje wiele sposobów na osiągnięcie tego, jednak korzystanie z niego jest (prawdopodobnie) czystsze
w całym teście, podczas innych testów używasz go do potwierdzenia pewnej liczby wykonań takich jak to:
Alternatywami są:
Alternatywnie - jeśli naprawdę chcesz się upewnić, że pewien wyśmiewany Obiekt wcale NIE jest wywoływany - możesz użyć:
źródło
Zarówno metoda, jak
verifyNoMoreInteractions()
iverifyZeroInteractions()
metoda wewnętrznie mają taką samą implementację jak:więc możemy użyć dowolnego z nich na próbnym obiekcie lub tablicy próbnych obiektów, aby sprawdzić, czy żadne metody nie zostały wywołane przy użyciu fałszywych obiektów.
źródło