He escrito algunas pruebas JUnit con @Test
anotaciones. 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 @Test
anotació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() {}
@expectedExceptionMessage
anotación en PHPUnit.Respuestas:
Podrías usar la
@Rule
anotación conExpectedException
, así:Tenga en cuenta que el ejemplo en los
ExpectedException
documentos es (actualmente) incorrecto: no hay un constructor público, por lo que debe usarloExpectedException.none()
.fuente
expectMessage
se especificó como una cadena vacía, no se realizó la comparación para el mensajethrows RuntimeException
después de agregar código que arroja una excepción. No lo atrapes ...failure.expectMessage(CoreMatchers.equalTo(...))
Me gusta la
@Rule
respuesta 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 deltry
bloque . 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
RuntimeException
como 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
ExpectedException
regla o atry-catch
.Ejemplo de sus documentos:
fuente
fuente
Junit
pero tu respuesta es darTestNG