jak sprawdzić, jak wywoływana jest metoda obiektu niebędącego makietą?

103

Wydaje się, że mockito tylko sprawdza, czy wywoływana jest metoda obiektu pozorowanego, a obiekt pozorowany zawsze ma coś podobnego doReturn().when(mock object)

Ale czy mogę utworzyć obiekt pozorowany i zdefiniować, doReturn().when(mock object) a następnie zweryfikować wywołanie metody innego obiektu?

Oto, co chcę zrobić: definiuję mockEnvironment i zwracam odpowiedź bez względu na to, co się stanie. Ale potem chcę sprawdzić, czy inne metody wywoływane są przez innyObj w różnych przypadkach.

Jak to zrobić?

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
źródło

Odpowiedzi:

121

Możesz użyć do tego Szpiega Mockito . Jeśli skonfigurujesz anotherObjjako szpieg, możesz zweryfikować wywołania metod na tym obiekcie. W swoim przykładzie musisz upewnić się, że wywołanie fooużywa szpiega zamiast zwykłej implementacji anotherObj. Szpieg jest skonfigurowany mniej więcej tak:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);
K Erlandsson
źródło
Oznacza to, że jeśli chcę zweryfikować wiele rzeczy, może być konieczne utworzenie i wstrzyknięcie wielu mockowanych obiektów? to nie jest wygodne.
user389955
@ user389955 tak, musisz skonfigurować każdy obiekt, który chcesz sprawdzić jako szpieg. O ile wiem, nie da się tego obejść. Mockito musi dodać proxy do obiektów i ktoś musi powiedzieć Mockito, które obiekty mają być proxy.
K Erlandsson
10
Zamiast mówić „// zrób coś”, pomocne może być dodanie, że to „innyObjSpy” musi wykonać testowane wywołanie metody.
jwehrle
Dzięki @jwehrle, w wywołaniach musisz używać anotherObjSpy, w przeciwnym razie testy nie będą działać.
argoth
2

Opisz obiekt niebędący pozorowaniem za pomocą @Spyadnotacji, a następnie sprawdź verify(). Sprawdź to

CodeHunter
źródło