Mockito prueba un método vacío arroja una excepción

399

Tengo un método con un voidtipo de retorno. También puede arrojar una serie de excepciones, por lo que me gustaría probar esas excepciones. Todos los intentos han fallado por la misma razón:

El método cuando (T) en el tipo Stubber no es aplicable para los argumentos (nulo)

¿Alguna idea de cómo puedo obtener el método para lanzar una excepción específica?

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
edwardmlyte
fuente

Respuestas:

706

Los paréntesis están mal colocados. Debes usar

doThrow(new Exception()).when(mockedObject).methodReturningVoid(...);
                                          ^

y no

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
                                                                   ^

Esto se explica en la documentación.

JB Nizet
fuente
77
@edwardmlyte Esta inconsistencia de Mockito es una de las razones por las que me he cambiado
Muel
@clement ambos se pueden usar: docs.mockito.googlecode.com/hg/latest/org/mockito/… . Crear una excepción no la arroja.
JB Nizet
1
@JB Nizet Estoy totalmente de acuerdo con usted, pero si escribo doThrow (nueva Excepción ()) en lugar de doThrow (Exception.class), tengo el siguiente error cuando inicio mi prueba; Excepción esperada com.company.project.exception.ElementNotFoundException pero obtuvo org.mockito.exceptions.base.MockitoException:
clement
2
Haga otra pregunta, con el código bajo prueba, el código de la prueba y el seguimiento completo de la pila de la excepción.
JB Nizet
66
doThrow (nueva Excepción ()). when (objeto) .voidMethod (any ());
Soumyajit Swain
14

Si alguna vez se preguntó cómo hacerlo utilizando el nuevo estilo BDD de Mockito:

willThrow(new Exception()).given(mockedObject).methodReturningVoid(...));

Y para futuras referencias, uno puede necesitar lanzar una excepción y luego no hacer nada:

willThrow(new Exception()).willNothing().given(mockedObject).methodReturningVoid(...));
Ondrej Burkert
fuente
1
Gracias por publicar esto aquí; si el método devuelve un valor: given (mockedObject.methodReturningAnObject ()). willThrow (new Exception ()); si el método no devuelve nada: willThrow (new Exception ()). given (mockedObject) .methodReturningVoid (...)); Explicación del formulario javadoc: "Stubbing vacíos requiere un enfoque diferente de {@link Mockito # when (Object)} (o BDDMockito.given) porque al compilador no le gustan los métodos vacíos entre paréntesis ..."
Wolf359