it-swarm.com.de

Mockito: Wie verifiziere ich, dass eine Methode nur einmal aufgerufen wurde, wobei genaue Parameter Aufrufe anderer Methoden ignorieren?

Verwenden von Mockito in Java wie eine Methode nur einmal mit genauen Parametern aufgerufen wurde, wobei Aufrufe anderer Methoden ignoriert wurden?

Beispielcode:

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())
    }

}

Was ist im Abschnitt TODO: don't allow all other invocations with add() zu tun?

Bereits erfolglos versucht:

  1. verifyNoMoreInteractions(foo);

Nee. Andere Methoden wie clear() können nicht aufgerufen werden.

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

Nee. Es wird nicht berücksichtigt, dass wir einen Aufruf von add("1") zulassen.

27
Igor Mukhin
Mockito.verify(foo, Mockito.times(1)).add("1");
Mockito.verify(foo, Mockito.times(1)).add(Mockito.anyString());

Der erste verify prüft den erwarteten parametrisierten Aufruf und der zweite verify prüft, ob überhaupt nur ein Aufruf von add erfolgte.

50
hunter

Die vorherige Antwort kann noch weiter vereinfacht werden.

Mockito.verify(foo).add("1");
Mockito.verify(foo).add(Mockito.anyString());

Die Einzelparameter-Methode verify ist nur ein Alias ​​für die Implementierung von times(1).

7
Travis Miller