Wie wird überprüft, ob eine Methode eines nicht nachgebildeten Objekts aufgerufen wird?

98

Es scheint, dass mockito nur überprüft, ob eine Methode eines Scheinobjekts aufgerufen wird und das Scheinobjekt immer so etwas hat doReturn().when(mock object)

Aber kann ich ein Scheinobjekt erstellen und definieren doReturn().when(mock object) und überprüfen, ob eine Methode eines anderen Objekts aufgerufen wird?

Folgendes möchte ich tun: Ich definiere eine mockEnvironment und gebe eine Antwort zurück, egal was passiert. Aber dann möchte ich überprüfen, ob verschiedene Methoden von anotherObj in verschiedenen Fällen aufgerufen werden.

Wie geht das?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}
user389955
quelle

Antworten:

118

Sie können dafür einen Mockito- Spion verwenden . Wenn Sie sich anotherObjals Spion einrichten, können Sie Methodenaufrufe für dieses Objekt überprüfen. In Ihrem Beispiel müssen Sie sicherstellen, dass der Aufruf von fooden Spion anstelle einer normalen Implementierung von verwendet anotherObj. Der Spion ist ungefähr so ​​eingerichtet:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);
K Erlandsson
quelle
Das bedeutet, dass ich möglicherweise mehrere verspottete Objekte erstellen und einfügen muss, wenn ich mehrere Dinge überprüfen möchte. das ist nicht bequem.
user389955
@ user389955 Ja, Sie müssen jedes Objekt, das Sie überprüfen möchten, als Spion einrichten. Soweit ich weiß, führt kein Weg daran vorbei. Mockito muss den Objekten einen Proxy hinzufügen und jemand muss Mockito mitteilen, welche Objekte zu vertreten sind.
K Erlandsson
10
Anstatt "// do stuff" zu sagen, kann es hilfreich sein, hinzuzufügen, dass es der "anotherObjSpy" ist, der den zu testenden Methodenaufruf ausführen muss.
jwehrle
Danke @jwehrle, du musst den anotherObjSpy in den Aufrufen verwenden, sonst funktionieren die Tests nicht.
Argoth
2

Kommentieren Sie das nicht nachgebildete Objekt mit @SpyAnmerkungen und suchen Sie nach verify(). Überprüfen Sie dies

CodeHunter
quelle