Eu escrevi alguns testes JUnit com @Test
anotação. Se meu método de teste gerar uma exceção marcada e se eu desejar afirmar a mensagem junto com a exceção, existe uma maneira de fazer isso com a @Test
anotação JUnit ? AFAIK, JUnit 4.7 não fornece esse recurso, mas alguma versão futura o fornece? Eu sei que no .NET você pode afirmar a mensagem e a classe de exceção. Procurando por um recurso semelhante no mundo Java.
É isso que eu quero:
@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
@expectedExceptionMessage
anotações no PHPUnit.Respostas:
Você pode usar a
@Rule
anotação comExpectedException
, assim:Observe que o exemplo nos
ExpectedException
documentos está (atualmente) errado - não há construtor público, então você deve usarExpectedException.none()
.fonte
expectMessage
foi especificado como uma cadeia vazia, a comparação para a mensagem não foi realizadathrows RuntimeException
depois de adicionar o código que gera uma exceção. Não pegue ...failure.expectMessage(CoreMatchers.equalTo(...))
Eu gosto da
@Rule
resposta. No entanto, se por algum motivo você não quiser usar regras. Existe uma terceira opção.fonte
Você tem que usar
@Test(expected=SomeException.class)
? Quando temos que afirmar a mensagem real da exceção, é isso que fazemos.fonte
@Test(expected=...)
eExpectedException
, é que eu já vi várias vezes alguém esquecer de fazer a chamadafail()
no final dotry
bloco . Se não for detectado pela revisão do código, seu teste poderá ser falso positivo e sempre será aprovado.No JUnit 4.13, você pode fazer:
Isso também funciona no JUnit 5, mas com diferentes importações:
fonte
Na verdade, o melhor uso é com try / catch. Por quê? Porque você pode controlar o local onde espera a exceção.
Considere este exemplo:
E se um dia o código for modificado e a preparação do teste gerar uma RuntimeException? Nesse caso, o teste real nem sequer é testado e, mesmo que não gere nenhuma exceção, o teste será aprovado.
É por isso que é muito melhor usar try / catch do que confiar na anotação.
fonte
RuntimeException
como exemplo, substitua esta exceção por qualquer outra exceção.Raystorm teve uma boa resposta. Também não sou muito fã de regras. Faço algo semelhante, exceto que eu crio a seguinte classe de utilitário para ajudar a legibilidade e usabilidade, que é uma das grandes vantagens das anotações em primeiro lugar.
Adicione esta classe de utilitário:
Então, para o meu teste de unidade, tudo o que preciso é deste código:
fonte
Se você estiver usando o @Rule, o conjunto de exceções será aplicado a todos os métodos de teste na classe Test.
fonte
Eu nunca gostei da maneira de afirmar exceções com Junit. Se eu usar o "esperado" na anotação, parece do meu ponto de vista que estamos violando o padrão "dado, quando, então" porque o "então" é colocado na parte superior da definição de teste.
Além disso, se usarmos "@Rule", teremos que lidar com muito código de clichê. Portanto, se você pode instalar novas bibliotecas para seus testes, sugiro dar uma olhada no AssertJ (essa biblioteca agora vem com o SpringBoot)
Em seguida, um teste que não está violando os princípios "dado / quando / então" e é feito usando o AssertJ para verificar:
1 - A exceção é o que estamos esperando. 2 - Tem também uma mensagem esperada
Ficará assim:
fonte
Eu gosto da resposta do user64141, mas achei que poderia ser mais generalizado. Aqui está a minha opinião:
Observe que deixar a instrução "fail" dentro do bloco try faz com que a exceção de asserção relacionada seja capturada; o uso de return dentro da instrução catch evita isso.
fonte
Importe a biblioteca de exceção-captura e use-a. É muito mais limpo que a
ExpectedException
regra ou atry-catch
.Exemplo dos documentos:
fonte
fonte
Junit
mas a resposta está dandoTestNG