Creo que esta pregunta necesita una respuesta actualizada, ya que la mayoría de las respuestas aquí están bastante desfasadas.
primer lugar a la pregunta de la OP:
Creo que es muy bien aceptado que la introducción del concepto "excepetion espera" en JUnit fue un mal movimiento, ya que la excepción podría ser levantado en cualquier lugar, y pasará la prueba. Funciona si lanzas (y afirmas) excepciones muy específicas del dominio, pero solo lanzo ese tipo de excepciones cuando estoy trabajando en un código que debe ser absolutamente inmaculado, - APIS simplemente lanzará las excepciones incorporadas como IllegalArgumentException
o IllegalStateException
. Si dos llamadas su creación podría arrojar potentitalmente estas excepciones, entonces la anotación @ExpectedException
pondrá su prueba en barra verde, incluso si es la línea incorrecta que arroja la excepción.
Para esta situación que he escrito una clase que estoy seguro que muchos otros han escrito aquí, que es un método assertThrows
:
public class Exceptions {
private Exceptions(){}
public static void assertThrows(Class<? extends Exception> expectedException, Runnable actionThatShouldThrow){
try{
actionThatShouldThrow.run();
fail("expected action to throw " + expectedException.getSimpleName() + " but it did not.");
}
catch(Exception e){
if (! expectedException.isInstance(e)) {
throw e;
}
}
}
}
este método simplemente devuelve si se produce la excepción, que le permite hacer otras afirmaciones/verificación en su prueba.
con sintaxis java 8 su prueba se ve muy bien.A continuación se muestra una de las pruebas más sencillas en nuestro modelo que utiliza el método:
@Test
public void when_input_lower_bound_is_greater_than_upper_bound_axis_should_throw_illegal_arg() {
//setup
AxisRange range = new AxisRange(0,100);
//act
Runnable act =() -> range.setLowerBound(200);
//assert
assertThrows(IllegalArgumentException.class, act);
}
estas pruebas son un poco torcidas debido a que el "acto" paso en realidad no realiza ninguna acción, pero creo que el significado es todavía bastante claro.
También hay una pequeña biblioteca pequeña en maven llamada catch-exception que usa la sintaxis de estilo mockito para verificar que se lanzan las excepciones. Se ve bonito, pero no soy fanático de los proxies dinámicos. Dicho esto, hay sintaxis es tan hábil que sigue siendo tentadora:
// given: an empty list
List myList = new ArrayList();
// when: we try to get the first element of the list
// then: catch the exception if any is thrown
catchException(myList).get(1);
// then: we expect an IndexOutOfBoundsException
assert caughtException() instanceof IndexOutOfBoundsException;
Por último, por la situación que me encontré al llegar a este hilo, hay una manera de ignorar pruebas si se cumple alguna conidition.
En este momento estoy trabajando para obtener algunos archivos DLL llamados a través de una biblioteca nativa java-cargando-biblioteca llamada JNA, pero nuestro servidor de compilación está en ubuntu. Me gusta tratar de impulsar este tipo de desarrollo con pruebas de JUnit, aunque están lejos de ser "unidades" en este momento. Lo que quiero hacer es ejecutar la prueba si estoy en una máquina local, pero ignorar la prueba si estamos en Ubuntu. JUnit 4 tiene una disposición de este, llamado Assume
:
@Test
public void when_asking_JNA_to_load_a_dll() throws URISyntaxException {
//this line will cause the test to be branded as "ignored" when "isCircleCI"
//(the machine running ubuntu is running this test) is true.
Assume.assumeFalse(BootstrappingUtilities.isCircleCI());
//an ignored test will typically result in some qualifier being put on the results,
//but will also not typically prevent a green-ton most platforms.
//setup
URL url = DLLTestFixture.class.getResource("USERDLL.dll");
String path = url.toURI().getPath();
path = path.substring(0, path.lastIndexOf("/"));
//act
NativeLibrary.addSearchPath("USERDLL", path);
Object dll = Native.loadLibrary("USERDLL", NativeCallbacks.EmptyInterface.class);
//assert
assertThat(dll).isNotNull();
}
Simplemente use declaración de devolución - en la mayoría de los casos que pasará como pase(). – topchef
@topchef ese solo comentario golpeó el martillo en la cabeza, mientras todos los demás debaten qué es aceptable y cuál no. –
Algunos sistemas de prueba (Perl Test :: Simple) cuentan las afirmaciones pasadas y fallidas. Sin embargo, Junit cuenta el número de _test methods_ que pasan y fallan. Por lo tanto, Junit no tiene el mismo uso para un método de 'pase'. –