Comment vérifier qu'une méthode est not appelée sur la dépendance d'un objet?
Par exemple:
public interface Dependency {
void someMethod();
}
public class Foo {
public bar(final Dependency d) {
...
}
}
Avec le test 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??**
}
}
Encore plus significatif:
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
// ...
verify(dependency, never()).someMethod();
La documentation de cette fonctionnalité est là §4 "Vérification du nombre exact d'invocations/au moins x/jamais" , et le never
javadoc est ici .
utilise le second argument de la méthode Mockito.verify
, comme dans:
verify(dependency, Mockito.times(0)).someMethod()
En règle générale, j’ai tendance à utiliser un bloc @After
dans le test:
@After
public void after() {
verifyNoMoreInteractions(<your mock1>, <your mock2>...);
}
Ensuite, le test est libre de vérifier uniquement comment devrait être appelé.
De plus, j’ai souvent oublié de vérifier "pas d’interactions", mais je me suis rendu compte plus tard que les choses appelées n’auraient pas dû être.
Je trouve donc ce modèle utile pour intercepter tous les appels inattendus qui n'ont pas été spécifiquement vérifiés.
Les méthodes verifyNoMoreInteractions()
et verifyZeroInteracions()
ont en interne la même implémentation que:
public static transient void verifyNoMoreInteractions(Object mocks[])
{
MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}
public static transient void verifyZeroInteractions(Object mocks[])
{
MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}
nous pouvons donc utiliser n'importe lequel d'entre eux sur un objet fantaisie ou sur un tableau d'objets fantaisie pour vérifier qu'aucune méthode n'a été appelée à l'aide d'objets fantaisie.