web-dev-qa-db-fra.com

Mockito: 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?

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:

  1. verifyNoMoreInteractions(foo);

Nan. Il n'autorise pas les appels à d'autres méthodes telles que clear().

  1. verify(foo, times(0)).add(any());

Nan. Il ne prend pas en compte le fait que nous permettons un appel à add("1").

27
Igor Mukhin
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.

50
hunter

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).

7
Travis Miller