He escrito algunas pruebas JUnit con @Testanotaciones. Si mi método de prueba arroja una excepción marcada y si quiero afirmar el mensaje junto con la excepción, ¿hay alguna manera de hacerlo con la @Testanotación JUnit ? AFAIK, JUnit 4.7 no proporciona esta función, pero ¿alguna versión futura la proporciona? Sé que en .NET puedes afirmar el mensaje y la clase de excepción. Buscando una característica similar en el mundo de Java.
Esto es lo que quiero:
@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}

@expectedExceptionMessageanotación en PHPUnit.Respuestas:
Podrías usar la
@Ruleanotación conExpectedException, así:Tenga en cuenta que el ejemplo en los
ExpectedExceptiondocumentos es (actualmente) incorrecto: no hay un constructor público, por lo que debe usarloExpectedException.none().fuente
expectMessagese especificó como una cadena vacía, no se realizó la comparación para el mensajethrows RuntimeExceptiondespués de agregar código que arroja una excepción. No lo atrapes ...failure.expectMessage(CoreMatchers.equalTo(...))Me gusta la
@Rulerespuesta Sin embargo, si por alguna razón no quieres usar reglas. Hay una tercera opción.fuente
¿Tienes que usar
@Test(expected=SomeException.class)? Cuando tenemos que afirmar el mensaje real de la excepción, esto es lo que hacemos.fuente
@Test(expected=...)yExpectedException, es que he visto en numerosas ocasiones a alguien olvidando poner la llamada alfail()final deltrybloque . Si no lo detecta la revisión de código, su prueba puede ser falsa positiva y siempre pasar.En JUnit 4.13 puedes hacer:
Esto también funciona en JUnit 5 pero con diferentes importaciones:
fuente
En realidad, el mejor uso es con try / catch. ¿Por qué? Porque puedes controlar el lugar donde esperas la excepción.
Considere este ejemplo:
¿Qué pasa si un día se modifica el código y la preparación de la prueba arrojará una RuntimeException? En ese caso, la prueba real ni siquiera se prueba e incluso si no arroja ninguna excepción, la prueba pasará.
Es por eso que es mucho mejor usar try / catch que confiar en la anotación.
fuente
RuntimeExceptioncomo un ejemplo, reemplazar esta excepción con cualquier otra excepción.Raystorm tuvo una buena respuesta. Tampoco soy un gran admirador de las reglas. Hago algo similar, excepto que creo la siguiente clase de utilidad para ayudar a la legibilidad y usabilidad, que es una de las grandes ventajas de las anotaciones en primer lugar.
Agregue esta clase de utilidad:
Luego, para mi prueba unitaria, todo lo que necesito es este código:
fuente
Si usa @Rule, el conjunto de excepciones se aplica a todos los métodos de prueba en la clase Prueba.
fuente
Nunca me gustó la forma de afirmar excepciones con Junit. Si uso el "esperado" en la anotación, parece que desde mi punto de vista estamos violando el patrón "dado, cuándo, entonces" porque el "entonces" se coloca en la parte superior de la definición de la prueba.
Además, si usamos "@Rule", tenemos que lidiar con tanto código repetitivo. Entonces, si puede instalar nuevas bibliotecas para sus pruebas, le sugiero que eche un vistazo a AssertJ (esa biblioteca ahora viene con SpringBoot)
Luego, una prueba que no está violando los principios "dado / cuándo / entonces", y se realiza utilizando AssertJ para verificar:
1 - La excepción es lo que esperamos. 2 - También tiene un mensaje esperado
Se verá así:
fuente
Me gusta la respuesta de user64141 pero descubrí que podría ser más generalizada. Aquí está mi opinión:
Tenga en cuenta que si deja la instrucción "fail" dentro del bloque try, se detecta la excepción de aserción relacionada; El uso de return dentro de la instrucción catch evita esto.
fuente
Importe la biblioteca de excepción de captura y úsela. Es mucho más limpio que la
ExpectedExceptionregla o atry-catch.Ejemplo de sus documentos:
fuente
fuente
Junitpero tu respuesta es darTestNG