it-swarm.com.de

Wie überprüfe ich, ob eine bestimmte Methode mit Mockito nicht aufgerufen wurde?

Wie überprüfe ich, ob eine Methode nicht von der Abhängigkeit eines Objekts aufgerufen wird?

Zum Beispiel:

public interface Dependency {
    void someMethod();
}

public class Foo {
    public bar(final Dependency d) {
        ...
    }
}

Mit dem Foo-Test:

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??**
    }
}
531
beluchin

Noch aussagekräftiger:

import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

// ...

verify(dependency, never()).someMethod();

Die Dokumentation dieser Funktion ist dort §4 "Überprüfung der genauen Anzahl von Aufrufen/mindestens x/nie" , und das never javadoc ist hier .

925
Brice

verwenden Sie das zweite Argument für die Mockito.verify -Methode wie folgt:

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

98
beluchin

Als allgemeineres Muster verwende ich im Test normalerweise einen @After -Block:

@After
public void after() {
    verifyNoMoreInteractions(<your mock1>, <your mock2>...);
}

Dann ist der Test frei, um nur zu verifizieren, was sollte genannt werden soll.

Außerdem stellte ich fest, dass ich oft vergessen hatte, nach "keinen Interaktionen" zu suchen, um später festzustellen, dass Dinge aufgerufen wurden, die eigentlich nicht hätten sein dürfen.

Daher finde ich dieses Muster nützlich, um alle unerwarteten Anrufe abzufangen, die nicht speziell überprüft wurden.

17
David Lavender

Sowohl die Methode verifyNoMoreInteractions() als auch die Methode verifyZeroInteracions() haben intern dieselbe Implementierung wie:

public static transient void verifyNoMoreInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

public static transient void verifyZeroInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

daher können wir eines von ihnen für ein Scheinobjekt oder ein Array von Scheinobjekten verwenden, um zu überprüfen, ob mithilfe von Scheinobjekten keine Methoden aufgerufen wurden.

8
Ujjwal