Estou usando mockito em um teste junit. Como você faz uma exceção acontecer e depois afirma que possui (pseudo-código genérico)
Estou usando mockito em um teste junit. Como você faz uma exceção acontecer e depois afirma que possui (pseudo-código genérico)
Respostas:
Mockito sozinho não é a melhor solução para lidar com exceções, use Mockito com Catch-Exception
given(otherServiceMock.bar()).willThrow(new MyException());
when(() -> myService.foo());
then(caughtException()).isInstanceOf(MyException.class);
caughtException
?
com.googlecode.catchexception.CatchException.caughtException;
Para responder sua segunda pergunta primeiro. Se você estiver usando o JUnit 4, poderá anotar seu teste com
@Test(expected=MyException.class)
afirmar que ocorreu uma exceção. E para "simular" uma exceção com o mockito, use
when(myMock.doSomething()).thenThrow(new MyException());
Se você quiser testar a mensagem de exceção, poderá usar o ExpectedException do JUnit com o 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()
De onde vem isto?
Resposta atualizada para 19/06/2015 (se você estiver usando o java 8)
Basta usar assertj
Usando assertj-core-3.0.0 + Java 8 Lambdas
@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
.isInstanceOf(IllegalArgumentException.class);
}
Referência: http://blog.codeleak.pl/2015/04/junit-testing-exceptions-with-java-8.html
Se você estiver usando o JUnit 4 e o Mockito 1.10.x, anote seu método de teste com:
@Test(expected = AnyException.class)
e para lançar a exceção desejada, use:
Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
Faça a exceção acontecer assim:
when(obj.someMethod()).thenThrow(new AnException());
Verifique se isso aconteceu afirmando que seu teste gerará uma exceção:
@Test(expected = AnException.class)
Ou pela verificação simulada normal:
verify(obj).someMethod();
A última opção é necessária se o seu teste for projetado para provar que o código intermediário lida com a exceção (ou seja, a exceção não será lançada do seu método de teste).
verify
chamada afirma a exceção?
when
cláusula esteja correta, ela deve ter gerado uma exceção.
Use o doThrow do Mockito e, em seguida, capture a exceção desejada para afirmar que foi lançada mais tarde.
@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);
}
Usando o mockito, você pode fazer a exceção acontecer.
when(testingClassObj.testSomeMethod).thenThrow(new CustomException());
Usando o Junit5, você pode afirmar a exceção, afirma se essa exceção é lançada quando o método de teste é chamado.
@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());
}
Encontre uma amostra aqui: assert exception junit
Não relacionado ao mockito, pode-se capturar a exceção e afirmar suas propriedades. Para verificar se a exceção ocorreu, afirme uma condição falsa no bloco try após a instrução que lança a exceção.
Ou se sua exceção for lançada do construtor de uma classe:
@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);
}
Afirme por mensagem de exceção:
try {
MyAgent.getNameByNode("d");
} catch (Exception e) {
Assert.assertEquals("Failed to fetch data.", e.getMessage());
}