Comment vérifier qu’une méthode spécifique n’a pas été appelée avec Mockito?

Comment vérifier qu’une méthode n’est pas appelée sur la dépendance d’un object?

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 javadoc never est ici .

utilisez le second argument de la méthode Mockito.verify , comme dans:

verify(dependency, Mockito.times(0) ).someMethod()

Comme un schéma plus général à suivre, j’ai tendance à utiliser un bloc @After dans le test:

 @After public void after() { verifyNoMoreInteractions(, ...); } 

Ensuite, le test est libre de vérifier uniquement ce qui devrait être appelé.

En outre, j’ai constaté que j’oubliais souvent de vérifier l’absence d’interactions, pour ensuite découvrir que des choses appelées n’auraient pas dû l’être.

Donc, je trouve ce modèle utile pour attraper tous les appels inattendus qui n’ont pas été spécifiquement vérifiés.

Les verifyNoMoreInteractions() et verifyZeroInteracions() ont toutes deux 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 object fictif ou un tableau d’objects fictifs pour vérifier qu’aucune méthode n’a été appelée à l’aide d’objects simulés.