JUnit assert. Tipos de assertions.
JUnit nos proporciona métodos en los cuales nosotros podemos hacer afirmaciones (Assertions), con estos métodos podemos afirmar tipos primitivos, objetos y arreglos. Estos métodos están conformados de esta manera, (Mensaje en caso de falla, valor esperado, valor real), en el valor real es en donde vamos a afirmar que un valor será el que nosotros creemos, hay que tomar en cuenta que algunos varían con valor esperado y valor real.
Un ejemplo de afirmación de una suma utilizando el método
En donde estamos afirmando que la operación (1 + 1) = 2.Sigue este tutorial y veras todos los tipos de afirmaciones:
Un ejemplo de afirmación de una suma utilizando el método
assertEquals
se vería así:
assertEquals("El resultado esta mal: ", 1 + 1, 2);
En donde estamos afirmando que la operación (1 + 1) = 2.
Assertions | Descripción |
---|---|
assertArrayEquals |
Sirve para comparar dos arreglos y afirmar distintas propiedades del mismo. |
assertEquals |
Sirve para comparar dos tipos de datos u objetos y afirmar que son iguales. |
assertFalse |
Sirve para afirmar que un tipo de dato u objeto es falso. |
assertNotNull |
Sirve para afirmar que un tipo de dato u objeto no es nulo. |
assertNotSame |
Sirve para comparar dos tipos de datos y afirmar que son distintos. |
assertNull |
Sirve para afirmar que un tipo de dato u objeto es nulo. |
assertThat |
Sirve para comparar un tipo de dato u objeto. A diferencia de los assertions normales este trabaja con Matcher |
assertTrue |
Sirve para afirmar que un tipo de dato u objeto es verdadero. |
assertArrayEquals:
@Test public void testAssertArrayEquals() { String[] nombresEsperados = { "java", "junit", "jboss" }; String[] nombresActuales = { "java", "junit", "jboss" }; assertArrayEquals("Fallo - No son los mismos arreglos", nombresEsperados, nombresActuales); }
Como vemos en este ejemplo estamos comparando dos arreglos, en este caso la prueba unitaria se realiza sin fallas porque los dos arreglos son iguales, pero si hacemos esto
@Test public void testAssertArrayEquals() { String[] nombresEsperados = { "java", "junit", "jboss" }; String[] nombresActuales = { "java", "junit", "jon server" }; assertArrayEquals("Fallo - No son los mismos arreglos", nombresEsperados, nombresActuales); }
assertArrayEquals
ya que los arreglos no son iguales y vemos la manera en la que nos ayuda el mensaje de falla para poder entender que es lo que paso.
assertEquals:
Para hacer esta prueba unitaria vamos a imaginar que tenemos un método en el cual se realiza una suma:
public int sumar(int num1, int num2) { int resultado = num1 + num2; return resultado; }Este método recibe dos números y devuelve un
int
en el cual está el resultado de la operación, para hacerle la prueba unitaria con JUnit tenemos que hacer esto:
@Test public void testSumar() { assertEquals("El resultado esta mal: ", sumar(1, 1), 2); }La prueba unitaria pasa sin ningún problema lo que quiere decir que el método
sumar(int, int)
está bien implementado. Para provocar la falla del método sumar(int, int)
con la afirmación assertEquals
podemos hacer un cambio simple y esto es lo que sucedería:
@Test public void testSumar() { assertEquals("El resultado esta mal: ", sumar(1, 1), 3); }
assertFalse:
Para hacer una prueba unitaria de esta afirmación imaginemos que tenemos un método que dependiendo de un bucle
for
devuelva un valor boolean
el cual nos indique si sobrepasa el máximo permitido o no.
public boolean validarMax(int maximo){ boolean max = false; for (int i = 0; i < maximo; i++) { if(i == 3){ max = true; break; } } return max; }El método
validarMax(int)
recibe una variable int
con la cual se evalúa si se devuelve un false
o un true
.
@Test public void testValidarMax() { assertFalse("Esta variable no es false: ", validarMax(3)); }
assertFalse
la prueba unitaria pasa sin problemas ya que la variable max
nunca llega a ser true
.assertNotNull:
@Test public void testAssertNotNull() { ListEn este ejemplo al principio declaramos la listanombres = new ArrayList (); assertNotNull("La lista 'nombres' esta null:", nombres); for (int i = 0; i < 3; i++) { if (i == 2) { nombres = null; } } assertNotNull("La lista 'nombres' esta null:", nombres); }
nombres
como new ArrayList()
lo que quiere decir que en la afirmación que hacemos después de eso la lista no está null
pero siguiendo con la porción de código notamos que hay un bucle for
en el cual la lista la ponemos null
y al hacer la afirmación de nuevo la misma falla.
assertNotSame:
En este ejemplo vamos a utilizar el mismo método
validarMax(int)
, lo que vamos hacer es afirmar que no devolverá el mismo valor si lo invocamos con distintos int
.
@Test public void testAssertNotSame() { boolean esMaximo = validarMax(4);// El retorno es true boolean noEsMaximo = validarMax(3);// EL retorno es falso assertNotSame("Fallo - No son iguales los dos objetos: ", esMaximo, noEsMaximo); }En el ejemplo anterior no hay error ya que estamos afirmando que no son los mismos valores.
assertNull:
Bueno esta afirmación es lo opuesto de
assertNotNull
jejeje obvio... de esta forma se utiliza
@Test public void testAssertNull() { String nombre = null; Listnombres = new ArrayList (); nombres.add("Java"); nombres.add("JUnit"); nombres.add("JBoss"); for(String n: nombres){ if(n.equals("JUnit")){ nombre = "Tutorial JUnit Assertions"; //Asignamos un valor a la variable break; } } assertNull("No esta nulo el objeto", nombre); }
null
.
assertThat:
Hemos llegado a una de las afirmaciones más interesantes que tiene JUnit, como dije en la descripción de esta afirmación
assertThat
, utiliza Matcher
. En este tutorial los Matcher's
utilizan la librería llamada Hamcrest. En otro dato java voy a explicarle las bondades de esta poderosa librería.Por ahora vamos hacer un ejemplo sencillo utilizando un
Matcher
que trae la librería Hamcrest para que vean de que se trata. Vamos hacer la misma afirmación con uno de los ejemplos anteriores para que vean la diferencia de una assert
normal y de un assertThat
.Primero refresquemos la memoria con el ejemplo de la afirmación
assertArrayEquals
:
@Test public void testAssertArrayEquals() { String[] nombresEsperados = { "java", "junit", "jboss" }; String[] nombresActuales = { "java", "junit", "jon server" }; assertArrayEquals("Fallo - No son los mismos arreglos", nombresEsperados, nombresActuales); }
assertThat
@Test public void testAssertThatArray() { String[] nombresEsperados = { "java", "junit", "jboss" }; String[] nombresActuales = { "java", "junit", "jon server" }; assertThat("Fallo - No son los mismos arreglos", nombresActuales, is(nombresEsperados)); }
assertArrayEquals
lo que quiere decir que es mejor implementar el assertThat
ya que es un poco más humano, es mas entendible, imagínate que después de mucho tiempo ejecutes las pruebas unitarias y hallan varios errores pero como de repente ya no te acuerdas y aparte el mensaje de error no te ayuda mucho tienes que comenzar a perder tiempo buscando que es lo que pasa. Como dije anteriormente próximamente estaré publicando un tutorial acerca de la librería Hamcrest así que pendiente.
assertTrue:
Obvio que se sabe que es lo opuesto de
assertFalse
, se puede usar de esta forma
@Test public void testAssertTrue() { assertTrue("Esta variable no es false: ", validarMax(4)); }
Muy buena entrada, fácil de entender y 100% recomendable!!
ResponderEliminarQue bueno que te gusto la entrada, Suerte Anónimo.
Eliminar