Comment vérifier qu'une méthode n'est pas 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??**
}
}
never
est la méthode la meilleure et la plus spécifique, mais si vous avez besoin de vérifier un objet factice entier, pensez également àverifyZeroInteractions(mockObject)
ouverifyNoMoreInteractions(mockObject)
.verifyZeroInteractions
est obsolète.verifyNoInteractions
est la suggestion d'une alternative. La version Mockito au moment de ce commentaire est le 3.3.3utilisez le deuxième argument de la
Mockito.verify
méthode, comme dans:verify(dependency, Mockito.times(0)).someMethod()
la source
never()
n'est pas beaucoup plus lisible quetimes(0)
. Mais l'existence denever
augmente la charge cognitive et rend le système mockito plus difficile à comprendre et à se rappeler comment l'utiliser. Donc, vraiment, mockito n'aurait pas dû inclurenever
dans leur API, cela ne vaut pas le coût mental.someMethod
été appelé 0 fois, ou vérifie-t-il seulement qu'ilsomeMethod
n'a jamais été appelé avec zéro argument?someMethod
argument avec zéro a été appelé zéro fois - non vérifié.Comme modèle plus général à suivre, j'ai tendance à utiliser un
@After
bloc dans le test:Ensuite, le test est libre de vérifier uniquement ce qui doit être appelé.
De plus, j'ai constaté que j'oubliais souvent de vérifier s'il n'y avait pas d'interactions, pour découvrir plus tard que des choses étaient appelées qui n'auraient pas dû l'être.
Je trouve donc ce modèle utile pour intercepter tous les appels inattendus qui n'ont pas été spécifiquement vérifiés.
la source
verifyNoMoreInteractions
? Les autres réponses ici reposent sur le rédacteur du test qui se souvient explicitement de lister ces vérifications: c'est trop sujet aux erreurs dans mon livre.Tout d'abord: vous devez toujours importer mockito static, de cette façon le code sera beaucoup plus lisible (et intuitif):
Il existe en fait de nombreuses façons d'y parvenir, mais il est (sans doute) plus propre d'utiliser le
partout dans vos tests, lorsque sur d'autres tests vous l'utilisez pour affirmer un certain nombre d'exécutions comme ceci:
Les alternatives sont:
Alternativement - lorsque vous voulez vraiment vous assurer qu'un certain objet simulé n'est PAS appelé du tout - vous pouvez utiliser:
la source
Les méthodes
verifyNoMoreInteractions()
etverifyZeroInteractions()
ont en interne la même implémentation que:nous pouvons donc utiliser n'importe lequel d'entre eux sur un objet fictif ou un tableau d'objets fictifs pour vérifier qu'aucune méthode n'a été appelée à l'aide d'objets fictifs.
la source