Mam następującą metodę, na której chcę sprawdzić zachowanie.
public void methodToTest(Exception e, ActionErrors errors) {
...
errors.add("exception.message",
ActionMessageFactory.createErrorMessage(e.toString()));
errors.add("exception.detail",
ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString()));
...
}
W mojej klasie @Test miałem nadzieję zrobić coś takiego, aby sprawdzić, czy errors.add()
jest wywoływane z „wyjątkiem.message” i ponownie z „wyjątkiem.detail”
verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));
jednak Mockito narzeka w następujący sposób
Argument(s) are different! Wanted:
actionErrors.add(
"exception.message",
<any>
);
Actual invocation has different arguments:
actionErrors.add(
"exception.detail",
org.apache.struts.action.ActionError@38063806
);
Jak mogę powiedzieć Mockito, aby sprawdzał obie wartości?
Mockito.reset()
Odpowiedzi:
Dalsza lektura skłoniła mnie do wypróbowania ArgumentCaptors i następnych prac, chociaż znacznie bardziej rozwlekłych, niż bym chciał.
źródło
methodToTest()
dokładnie raz, dlatego ta odpowiedź weryfikuje, czy oba wywołania są wykonane razem. PrzechwyconyList<String> values
element, który jest potwierdzany, będzie zawierał tylko dwie testowane wartości i żadnych innych. Możesz też dodaćassertTrue(values.size == 2)
. Jeśli tego chcesz, zastąpiłbym 3 stwierdzenia assertTrue pojedynczym Hamcrestem ...assertThat(values, contains("exception.message", "exception.detail"));
methodToTest()
jeden raz. Jest to argument metody, któryActionErrors errors
jest wywoływany wewnętrznie dwukrotnie.Jeśli kolejność obu
add()
połączeń jest istotna, możesz użyćInOrder
:źródło
errors
argument:InOrder inOrder = inOrder(errors);
(patrz dokumentacja )List
sięSet
i twierdzą, że zestaw wejść równa podanego zestawu przez zrzuty argument.Spróbuj czegoś takiego:
źródło
prawdopodobnie masz problem w swoim kodzie. Ponieważ w rzeczywistości piszesz ten kod:
Zauważ, że pierwsza weryfikacja nie jest równa w odniesieniu do rzeczywistych wywołań.
Radziłbym również, aby właściwie nie kpić z typów, których nie jesteś właścicielem, np. Typu rozpórki.
[EDYCJA @Brad]
Po uruchomieniu kodu Brice'a (powyżej) w moim IDE widzę, że użyłem ActionError zamiast ActionMessage, dlatego moja weryfikacja () nie pasuje. Komunikat o błędzie, który opublikowałem początkowo, wprowadzał mnie w błąd, myśląc, że to pierwszy niezgodny argument. Okazuje się, że był to drugi argument.
Tak więc odpowiedź na moje pytanie brzmi
źródło
InOrder
.Możesz użyć,
Mockito.atLeastOnce()
który pozwala Mockito przejść test, nawet jeśli ten mockObject będzie wywoływany wiele razy.źródło
1) Powiedz Mokito o całkowitym oczekiwaniu na rozmowy.
2) Powiedz Mokito, ile razy każda kombinacja parametrów była oczekiwana.
źródło
W podobny sposób jak @ sendon1928 możemy użyć:
aby upewnić się, że metoda została wywołana dokładną liczbę razy (moim zdaniem preferowane rozwiązanie). Potem możemy zadzwonić
Aby upewnić się, że makieta nie była dalej używana w żadnym kontekście. Pełny przykład:
źródło