Używam mockito w teście junit. Jak zrobić wyjątek, a następnie potwierdzić, że ma (ogólny pseudokod)
Używam mockito w teście junit. Jak zrobić wyjątek, a następnie potwierdzić, że ma (ogólny pseudokod)
Odpowiedzi:
Samo Mockito nie jest najlepszym rozwiązaniem do obsługi wyjątków, używaj Mockito z Catch-Exception
given(otherServiceMock.bar()).willThrow(new MyException());
when(() -> myService.foo());
then(caughtException()).isInstanceOf(MyException.class);
caughtException
?
com.googlecode.catchexception.CatchException.caughtException;
Najpierw odpowiedz na twoje drugie pytanie. Jeśli używasz JUnit 4, możesz oznaczyć swój test adnotacją
@Test(expected=MyException.class)
aby potwierdzić, że wystąpił wyjątek. Aby „wyszydzić” wyjątek z mockito, użyj
when(myMock.doSomething()).thenThrow(new MyException());
Jeśli chcesz również przetestować komunikat o wyjątku, możesz użyć ExpectedException JUnit z Mockito:
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void testExceptionMessage() throws Exception {
expectedException.expect(AnyException.class);
expectedException.expectMessage("The expected message");
given(foo.bar()).willThrow(new AnyException("The expected message"));
}
given()
Skąd to pochodzi?
Zaktualizowana odpowiedź na 19.06.2015 (jeśli używasz java 8)
Po prostu użyj assertj
Korzystanie z assertj-core-3.0.0 + Java 8 Lambdas
@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
.isInstanceOf(IllegalArgumentException.class);
}
Źródła: http://blog.codeleak.pl/2015/04/junit-testing-exceptions-with-java-8.html
Jeśli używasz JUnit 4 i Mockito 1.10.x Opisz swoją metodę testową:
@Test(expected = AnyException.class)
i aby rzucić żądane użycie wyjątku:
Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
Zrób wyjątek w ten sposób:
when(obj.someMethod()).thenThrow(new AnException());
Sprawdź, czy to się stało, albo potwierdzając, że Twój test zgłosi taki wyjątek:
@Test(expected = AnException.class)
Lub przez normalną weryfikację próbną:
verify(obj).someMethod();
Ta ostatnia opcja jest wymagana, jeśli test ma na celu udowodnienie, że kod pośredni obsługuje wyjątek (tj. Wyjątek nie zostanie wyrzucony z metody testowej).
verify
wywołanie stwierdza wyjątek?
when
klauzula jest poprawna, musiała zgłosić wyjątek.
Użyj doThrow Mockito, a następnie złap żądany wyjątek, aby potwierdzić, że został wyrzucony później.
@Test
public void fooShouldThrowMyException() {
// given
val myClass = new MyClass();
val arg = mock(MyArgument.class);
doThrow(MyException.class).when(arg).argMethod(any());
Exception exception = null;
// when
try {
myClass.foo(arg);
} catch (MyException t) {
exception = t;
}
// then
assertNotNull(exception);
}
Używając mockito, możesz zrobić wyjątek.
when(testingClassObj.testSomeMethod).thenThrow(new CustomException());
Korzystając z Junit5, możesz potwierdzić wyjątek, sprawdzić , czy ten wyjątek jest generowany podczas wywoływania metody testing .
@Test
@DisplayName("Test assert exception")
void testCustomException(TestInfo testInfo) {
final ExpectCustomException expectEx = new ExpectCustomException();
InvalidParameterCountException exception = assertThrows(InvalidParameterCountException.class, () -> {
expectEx.constructErrorMessage("sample ","error");
});
assertEquals("Invalid parametercount: expected=3, passed=2", exception.getMessage());
}
Znajdź przykład tutaj: assert wyjątek junit
W przeciwieństwie do mockito, można wychwycić wyjątek i potwierdzić jego właściwości. Aby sprawdzić, czy wyjątek się wydarzył, potwierdź fałszywy warunek w bloku try po instrukcji, która zgłasza wyjątek.
Lub jeśli twój wyjątek jest wyrzucany z konstruktora klasy:
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void myTest() {
exception.expect(MyException.class);
CustomClass myClass= mock(CustomClass.class);
doThrow(new MyException("constructor failed")).when(myClass);
}
Potwierdź przez komunikat wyjątku:
try {
MyAgent.getNameByNode("d");
} catch (Exception e) {
Assert.assertEquals("Failed to fetch data.", e.getMessage());
}