when tutorial test expectedexception expected español java unit-testing junit

java - tutorial - ¿Es contrario a las mejores prácticas lanzar Exception en la mayoría de las pruebas JUnit?



junit when throw exception (4)

Casi todas mis pruebas de JUnit están escritas con la siguiente firma:

public void testSomething() throws Exception

Mi razonamiento es que puedo concentrarme en lo que estoy probando en lugar de en el manejo de excepciones que JUnit parece darme gratis. ¿Pero me estoy perdiendo algo al hacer esto? ¿Está en contra de las mejores prácticas? ¿Obtendría algo al capturar explícitamente excepciones específicas en mi prueba y luego fallar () en ellas?


El principal beneficio es cuando está probando algún escenario que requiere que se lance una Excepción (por ejemplo, manejo err-r)

Puede usar JUnit4 en algo como: @Test (expected = ArithmeticException.class) pero a algunas personas les resulta más difícil de leer / revelar menos la intención que un bloque try explícito {} catch (Exception e), y si desea verificar estado (digamos de algún objeto simulado, o para ver si la excepción fue lanzada en el lugar correcto, o registrada, o similar)


En general, si está probando un caso en el que no espera que se produzca una Excepción, entonces simplemente permitiría que el método de prueba lance la Excepción como lo ha ilustrado, ya que diferenciará muy bien entre los casos de prueba con fallas (no pasan uno de sus aserciones) y casos de prueba de error (causan una excepción inesperada). Los TestRunners de JUnit capturarán la Excepción lanzada independientemente, por lo que no tiene que preocuparse por el rescate completo de su conjunto de pruebas si se lanza una Excepción.

Por otro lado, si está escribiendo una prueba que se supone que debe desencadenar una excepción, entonces desea usar la @Test(expected=IllegalArgumentException.class) de la anotación JUnit 4, o el idioma más común de JUnit 3 :

try { target.someMethodToTest(); fail("Should have gotten an exception"); } catch (IllegalStateException ise) { //expected, it''s all good }


NO atrapes y fallas, perderás información valiosa. Deja que todas las excepciones salgan volando. Esto significa que debe agregar cada excepción marcada a su firma que se puede lanzar. Sin embargo, te aconsejo que no tomes la salida perezosa y utilices a ciegas la throws Exception como un hábito. Esto te excusa de tener que pensar siquiera cómo se comporta realmente tu API con respecto a las excepciones.


Si se lanza una excepción y no la espera, la prueba debería fallar.

Si es una excepción no marcada, permito que se lance la excepción y que JUnit no pase la prueba.

Si se trata de una excepción marcada, tiene una opción: agregue la excepción a la cláusula de lanzamientos de la firma del método o cópiela dentro del método. El compilador te obligará a elegir, porque no puedes ejecutar el código sin ninguna de estas opciones.

Últimamente he tendido a no detectar excepciones dentro de mis pruebas. Si se supone que lanza una excepción, la marco como tal con la anotación. Si lanza una excepción sin marcar, dejé JUnit y la prueba falla. Si es una excepción marcada, agrego la cláusula de lanzamientos a la firma del método y dejé que JUnit falle la prueba para mí.