Estou tentando fazer com que um dos meus objetos zombados gere uma exceção verificada quando um método específico é chamado. Estou tentando o seguinte.
@Test(expectedExceptions = SomeException.class)
public void throwCheckedException() {
List<String> list = mock(List.class);
when(list.get(0)).thenThrow(new SomeException());
String test = list.get(0);
}
public class SomeException extends Exception {
}
No entanto, isso produz o seguinte erro.
org.testng.TestException:
Expected exception com.testing.MockitoCheckedExceptions$SomeException but got org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: com.testing.MockitoCheckedExceptions$SomeException
Olhando para a documentação do Mockito , eles usam apenas RuntimeException
, não é possível lançar exceções verificadas de um objeto simulado com o Mockito?
Throws
anotação para fazer com que o compilador gere o mesmo bytecode que declara lances no código Java equivalente. Veja [aqui] ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-throws/… ) para mais detalhes.Uma solução alternativa é usar um
willAnswer()
métodoPor exemplo, o seguinte funciona (e não lança um,
MockitoException
mas realmente lança um verificadoException
conforme necessário aqui) usandoBDDMockito
:O equivalente a Mockito comum usaria o
doAnswer
métodofonte
willAnswer( invocation -> { throw new Exception("abc msg"); }).given(someObj).someMethod(stringArg1);
quando o método retornarvoid
.willThrow()
normalmente permite, escrevi um GistdoAnswer
denhaarman.mockitokotlin2
Note-se que, em geral, Mockito não permitir jogando exceções verificadas desde que a exceção é declarado na assinatura da mensagem. Por exemplo, dado
é legal escrever:
No entanto, se você lançar uma exceção marcada não declarada na assinatura do método, por exemplo,
O Mockito falhará em tempo de execução com a mensagem genérica um tanto enganosa:
Isso pode levar você a acreditar que as exceções verificadas em geral não são suportadas, mas na verdade o Mockito está apenas tentando informar que essa exceção verificada não é válida para esse método .
fonte
Existe a solução com o Kotlin:
De onde vem o dado
fonte
Isso funciona para mim em Kotlin:
Nota: Lance qualquer exceção definida que não seja Exception ()
fonte
Exception