Estoy tratando de que uno de mis objetos burlados arroje una excepción marcada cuando se llama a un método en particular. Estoy intentando lo siguiente.
@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 {
}
Sin embargo, eso produce el siguiente error.
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
Mirando la documentación de Mockito , solo usan RuntimeException
, ¿no es posible lanzar Excepciones marcadas de un objeto simulado con Mockito?
Throws
anotaciones para hacer que el compilador genere el mismo código de bytes que declarar tiros en el código Java equivalente. Ver [aquí] ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-throws/… ) para más detalles.Una solución alternativa es utilizar un
willAnswer()
método.Por ejemplo, lo siguiente funciona (y no arroja un,
MockitoException
pero en realidad arroja un marcadoException
como se requiere aquí) usandoBDDMockito
:El equivalente para Mockito simple sería usar el
doAnswer
métodofuente
willAnswer( invocation -> { throw new Exception("abc msg"); }).given(someObj).someMethod(stringArg1);
cuando el método regresevoid
.willThrow()
normalmente lo permite, he escrito un GistdoAnswer
desdenhaarman.mockitokotlin2
Tenga en cuenta que, en general, Mockito no permite lanzar excepciones controladas, siempre y cuando la excepción se declara en la firma del mensaje. Por ejemplo, dado
es legal escribir:
Sin embargo, si arroja una excepción marcada no declarada en la firma del método, por ejemplo
Mockito fallará en tiempo de ejecución con el mensaje genérico algo engañoso:
Esto puede llevarlo a creer que las excepciones marcadas en general no son compatibles, pero de hecho Mockito solo está tratando de decirle que esta excepción marcada no es válida para este método .
fuente
Existe la solución con Kotlin:
De donde viene dado
fuente
Esto funciona para mí en Kotlin:
Nota: Lanza cualquier excepción definida que no sea Exception ()
fuente
Exception