Utiliser Mockito dans Java comment vérifier qu'une méthode n'a été appelée qu'une fois avec des paramètres exacts ignorant les appels à d'autres méthodes?
Exemple de code:
public class MockitoTest {
interface Foo {
void add(String str);
void clear();
}
@Test
public void testAddWasCalledOnceWith1IgnoringAllOtherInvocations() throws Exception {
// given
Foo foo = Mockito.mock(Foo.class);
// when
foo.add("1"); // call to verify
foo.add("2"); // !!! don't allow any other calls to add()
foo.clear(); // calls to other methods should be ignored
// then
Mockito.verify(foo, Mockito.times(1)).add("1");
// TODO: don't allow all other invocations with add()
// but ignore all other calls (i.e. the call to clear())
}
}
Que devrait-on faire dans la section TODO: don't allow all other invocations with add()
?
Déjà essayé sans succès:
verifyNoMoreInteractions(foo);
Nan. Il n'autorise pas les appels à d'autres méthodes telles que clear()
.
verify(foo, times(0)).add(any());
Nan. Il ne prend pas en compte le fait que nous permettons un appel à add("1")
.
Mockito.verify(foo, Mockito.times(1)).add("1");
Mockito.verify(foo, Mockito.times(1)).add(Mockito.anyString());
Le premier verify
vérifie l'appel paramétré attendu et le second verify
vérifie qu'il n'y a eu qu'un seul appel à add
.
La réponse précédente peut être simplifiée encore davantage.
Mockito.verify(foo).add("1");
Mockito.verify(foo).add(Mockito.anyString());
Le paramètre unique verify
method n'est qu'un alias de l'implémentation times(1)
.