2012-09-14 9 views
10

Piszę testy jednostkowe dla mojej aplikacji i zastanawiałem się, czy możliwe jest, aby struktura Mockito wpłynęła na obiekt, który jest przekazywany do metody, która zwraca pustkę z wyśmiewanej klasy . Na przykład wywołanie wyśmiewanej klasy sprawdzania poprawności zawierającej metodę, która zwraca void, ale śledzi różne zmiany i metadane za pośrednictwem obiektu przekazanego jako argument. .Jak wyśmiać metodę zwracania pustki wpływającą na obiekt

public GetCartItemsOutput getCartItems(GetCartItemsInput getCartItemsInput) { 
    CartItemsFilter cartItemsFilter = new CartItemsFilter(); 
    validator.validateCartItemsInput(getCartItemsInput, cartItemsFilter); ... 

I wyśmiewali klasę validator do innych moich testów, ale na ten jeden muszę kpić zmiany do obiektu cartItemsFilter który nie wiem jak to zrobić.

Odpowiedz

18

Odpowiedź brzmi: tak, możesz i są zasadniczo dwa poziomy robienia tego, w zależności od potrzeby twojego testu.

Jeśli chcesz tylko przetestować interakcję z wyszydzanym obiektem, możesz po prostu użyć metody verify(), aby sprawdzić, czy została wywołana metoda void.

Jeśli test rzeczywiście potrzebuje szydzili obiekt do modyfikowania parametrów przekazywanych do niego, trzeba będzie wdrożyć Answer:

EDITED pokazać właściwą formę korzystania Odbierz metodą void

doAnswer(new Answer() { 
    Object answer(InvocationOnMock invocation) { 
     Object[] args = invocation.getArguments(); 
     ((MyClass)args[0]).myClassSetMyField(NEW_VALUE); 
     return null; // void method, so return null 
    } 
}).when(mock).someMethod(); 
+0

Dzięki za pomoc. Zajęło mi trochę czasu, aby zawinąć głowę "((MyClass) args [0]). MyClassSetMyField (NEW_VALUE);", ale w końcu zorientowałem się, że chodzi o ustawienie parametrów argumentu, który przekazałem do mojej wyśmiewanej metody. Znowu ty. – tamuren

0

ArgumentCaptor może również pomóc.

Oto fragment znaleziono here:

ArgumentCaptor<GetCartItemsInput > argument = ArgumentCaptor.forClass(GetCartItemsInput .class); 
    verify(mock).getCartItems(argument.capture()); 
    assertEquals(cartItemsFilter, argument.getValue()); 
+1

To nie rozwiąże problemu op, musi wdrożyć odpowiedź – iwein

1

Aby dodać odpowiedź Kevin Welker, w jeśli MojaKlasa jest niestandardowej klasy, a następnie zdefiniować metodę equals/hashcode w nim, tak że Mockito można go użyć aby dokładnie dopasować do wywołania metody.

W moim przypadku „MojaKlasa” był w API innej firmy, więc musiałem użyć metody „każdy”, jak poniżej -

doAnswer(new Answer() { 
    Object answer(InvocationOnMock invocation) { 
     Object[] args = invocation.getArguments(); 
     ((MyClass)args[0]).myClassSetMyField(NEW_VALUE); 
     return null; // void method, so return null 
    } 
}).when(mock).someMethod(any(MyClass.class));