eduardmlyte
Tengo un método con un void
tipo de retorno. También puede generar una serie de excepciones, por lo que me gustaría probar esas excepciones que se generan. Todos los intentos han fallado por la misma razón:
El método when(T) en el tipo Stubber no es aplicable para los argumentos (void)
¿Alguna idea de cómo puedo obtener el método para lanzar una excepción específica?
doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
JB Nizet
Los paréntesis están mal colocados.
Necesitas usar:
doThrow(new Exception()).when(mockedObject).methodReturningVoid(...);
^
y NO usar:
doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
^
Esto se explica en la documentación
-
@edwardmlyte Esta inconsistencia de Mockito es una de las razones por las que cambié a MoxieMocks
– Muel
20/10/2014 a las 17:37
-
@clement se pueden usar ambos: docs.mockito.googlecode.com/hg/latest/org/mockito/…. Crear una excepción no la arroja.
– JB Nizet
23 de julio de 2015 a las 15:27
-
@JB Nizet Estoy totalmente de acuerdo con usted, pero sin embargo, si escribo doThrow (nueva excepción ()) en lugar de doThrow (Exception.class), tengo el siguiente error cuando inicio mi prueba; Se esperaba la excepción com.company.project.exception.ElementNotFoundException pero se obtuvo org.mockito.exceptions.base.MockitoException:
– clemente
24 de julio de 2015 a las 8:21
-
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
24 de julio de 2015 a las 9:17
-
doThrow(nueva excepción()).when(objeto).voidMethod(any());
– Soumyajit Swain
18 de noviembre de 2016 a las 6:38
ondrej burkert
Si alguna vez te preguntaste cómo hacerlo usando el nuevo estilo BDD de Mockito:
willThrow(new Exception()).given(mockedObject).methodReturningVoid(...));
Y para referencia futura, es posible que deba lanzar una excepción y luego no hacer nada:
willThrow(new Exception()).willDoNothing().given(mockedObject).methodReturningVoid(...));
-
Gracias por publicar esto aquí; si el método devuelve un valor: dado(mockedObject.methodReturningAnObject()).willThrow(new Exception()); si el método no devuelve nada: willThrow(new Exception()).given(mockedObject).methodReturningVoid(…)); Formulario de explicación javadoc: “Stubbing voids requiere un enfoque diferente de {@link Mockito#when(Object)} (o BDDMockito.given) porque al compilador no le gustan los métodos void entre paréntesis…”
– Lobo359
17 de diciembre de 2018 a las 7:55
ayushi
Puedes probar algo como lo siguiente:
given(class.method()).willAnswer(invocation -> {
throw new ExceptionClassName();
});
En mi caso, quería lanzar una excepción explícita para un bloque de prueba, mi bloque de método era algo como el siguiente
public boolean methodName(param) throws SomeException{
try(FileOutputStream out = new FileOutputStream(param.getOutputFile())) {
//some implementation
} catch (IOException ioException) {
throw new SomeException(ioException.getMessage());
} catch (SomeException someException) {
throw new SomeException (someException.getMessage());
} catch (SomeOtherException someOtherException) {
throw new SomeException (someOtherException.getMessage());
}
return true;
}
He cubierto todas las excepciones anteriores para la cobertura de sonar como a continuación
given(new FileOutputStream(fileInfo.getOutputFile())).willAnswer(invocation -> {
throw new IOException();
});
Assertions.assertThrows(SomeException.class, () ->
{
ClassName.methodName(param);
});
-
given(class.method())
da el mismo error. SumethodName
devuelve un booleano, mientras que OP lo requería explícitamente para devolver vacío– Cristian Traina
3 de junio a las 12:42
Posible duplicado de Cómo hacer métodos simulados para anular con mockito
– Willian
24/07/2017 a las 20:40