Galet
Código:-
try {
Assert.assertEquals("1", "2");
} catch (Exception e) {
System.out.println("I am in error block");
}
Si las declaraciones de afirmación fallan, me gustaría capturar el error en el bloque catch. Estoy intentando con el código anterior y no está sucediendo.
¿Se detectará el error de aserción en un bloque catch para la excepción de Java?
J Richard Snape
Casi has respondido a tu propia pregunta. Su bloque catch no atrapará el AssertionError
que el Assert
tira si falla, porque es un Error
(o, más específicamente, se extiende java.lang.Error
). ver los documentos para obtener más información sobre esto. Tu bloque catch solo atrapa Throwable
objetos que se extienden java.lang.Exception
Si realmente quieres atraparlo, debes usar
catch (AssertionError e) {
...
Sin embargo, como han mencionado otros, esta es una forma muy inusual de usar aserciones: por lo general, deberían pasar y si fallan, es muy inusual que desee continuar con la ejecución del programa. Por eso el fracaso arroja un Error
en lugar de un Exception
. Puedes leer más sobre (no) atrapar Error
en esta pregunta
Si solo desea probar el valor de la variable, se prefiere usar if ( variableName == "1")
NÓTESE BIEN si está probando el código auxiliar de prueba unitaria, como un comparador, podría tener sentido capturar el AssertionError
.
-
Cuando uno quiere ver si una clase auxiliar de prueba unitaria está haciendo lo correcto (mediante pruebas unitarias ;-)), uno esperaría poder detectar tal AssertionError. Esa sería una situación válida para atraparlo, ¿no?
– gkephorus
18 de enero de 2016 a las 8:05
-
@gkephorus sí, supongo que podría ser. Siéntase libre de editar eso como un “NB” si lo desea y lo aprobaré 🙂
–J Richard Snape
18 de enero de 2016 a las 9:49
-
@JRichardSnape: quiero comparar dos objetos java (obtenidos de objetos json) que solo tienen variables de cadena con captadores y definidores, es decir, POJO. Solo quiero comparar algunas (no todas) de las variables para determinar una coincidencia. Para una de las variables, solo se debe comparar el valor parcial. ¿Es una buena idea poner todas mis afirmaciones en un bloque try catch (AssertionError)? De esa manera, puedo devolver falso en la parte de captura para indicar qué campo no coincide, con una cadena de mensaje de error útil. De esta manera, no tendré que escribir varios if else. Suena bien ?
– MaestroJoe
9 de marzo de 2018 a las 5:46
-
Con respecto a: “NB, si está probando el código auxiliar de prueba unitaria, como un comparador, podría tener sentido detectar el AssertionError” – Recomendaría usar
org.junit.rules.ExpectedException.handleAssertionErrors()
– josle
7 febrero 2019 a las 16:36
-
catch (AssertionError e) { }
no se invoca en mi caso. no atraparásAssertionError
es el mantra aquí.– daparic
2 de enero de 2020 a las 10:16
Si quieres atrapar a los dos Exception
y Error
uso de instancias:
...
catch (Throwable t)
{
...
}
Ya que ambos Exception
y Error
extender Throwable
.
Bueno, creo que estás usando JUnit para escribir tus pruebas. En ese caso, no debe atrapar su Assert.assertEquals()
porque deberían pasar por la ejecución normal de la prueba. Si arroja alguna excepción, significa que su código no está funcionando como debería.
-
sí, mi código de aserción arroja una excepción. Pero quiero capturar todos los errores tales como afirmaciones o cualquier otro error por clase de Excepción. Cómo puedo hacerlo ?
– Galet
16 de abril de 2015 a las 10:28
-
no puedes
AssertionError
hereda deError
lo que significatry...catch
no será capaz de manejarlos. Mira aquí docs.oracle.com/javase/7/docs/api/java/lang/AssertionError.html. Si de todos modos necesita atraparlos, vea la respuesta de SpaceCowboy.– Akash
16 de abril de 2015 a las 10:33
-
@Aakash eso es incorrecto, esto funciona bien:
try { throw new AssertionError(); } catch( AssertionError e){ System.out.println("ok");}
– danyamachine
21 de agosto de 2018 a las 19:37
-
@danyamachine como dije, nosotros debería no atrapar
AssertionError
o cualquierError
para esa materia. Los errores están ahí para decirle al desarrollador que ha ocurrido algo incorrecto y que el programa no debe continuar. Es una respuesta tardía, pero más vale tarde que nunca 🙂– Akash
20 oct 2019 a las 16:18
Si desea detectar los errores de esa manera, necesita algo como lo siguiente:
if (num == 1 || num == 2) {
throw new Exception();
}
Puede crear su propia clase de excepción y pasar el mensaje que desee.
¿Por qué querrías hacer eso de todos modos? Esto parece un grave mal uso de
Assert
que está destinado a pruebas unitarias– Dragondraikk
16 de abril de 2015 a las 10:25