6.1 afirma

Las afirmaciones son comprobaciones especiales que se pueden insertar en diferentes lugares del código. Su tarea es determinar que algo salió mal. O mejor dicho, para comprobar que todo va como debe. Esto es "según sea necesario" y le permiten configurarlo de varias maneras.

Ya ha encontrado algunas afirmaciones en el código anterior. El primero es comprobar la igualdad de los objetos. Si los objetos no son iguales, se lanzará una excepción y la prueba fallará.

El orden de comparación es importante aquí , porque JUnit en el informe final escribirá algo así como "valor 1 recibido, pero se esperaba 3". El formato general para tal verificación es:

assertEquals(standard , meaning)

Ejemplo:

@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";

    assertEquals(expected, actual);
}

6.2 Métodos afirmarEquals, afirmarVerdadero, afirmarFalso

A continuación, enumeraré los métodos más populares: aserciones. Por sus nombres, es bastante posible adivinar cómo funcionan. Pero voy a escribir una breve explicación de todos modos:

afirmarIgual Comprueba que dos objetos son iguales
afirmarArrayEquals Comprueba si dos matrices contienen valores iguales
afirmarNoNulo Comprueba si el argumento no es nulo
afirmarNulo Comprueba si el argumento es nulo
afirmarNoEsLo Mismo Comprueba que los dos argumentos no son el mismo objeto.
afirmar lo mismo Comprueba que los dos argumentos son el mismo objeto.
afirmarVerdadero Comprueba si el argumento es verdadero
afirmarFalso Comprueba si el argumento es falso

Algunos de estos métodos parecen redundantes. ¿Por qué usar assertSame(a, b) cuando solo puedes escribir assertTrue(a == b) ?

El punto es que afirmar es un método muy inteligente. Hace muchas cosas útiles, incluida la escritura de información de error en el registro . En el primer caso, escribirá que se esperaba el objeto A, pero se recibió el objeto B. En el segundo caso, simplemente escribirá que se esperaba verdadero .

Cuando tiene cientos de pruebas, especialmente aquellas que se ejecutan en un servidor de prueba dedicado, tener registros detallados puede ser muy útil. Creo que entiendes lo que quiero decir.

Ejemplo de comparación de matrices:

@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();

    assertArrayEquals(expected, actual);
}

6.3 método afirmarTodo

Como se mencionó anteriormente, el método de afirmación no solo realiza una verificación, sino que también escribe mucha información sobre objetos comparables en el registro.

Hagamos una comparación:

Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

Pero si uno de los parámetros no coincide, el resto no se verificará. Pero me gustaría que aún ocurran y que sus resultados se registren en el registro. Pero al mismo tiempo, si al menos una verificación falló, la prueba aún falló.

Hay un método especial para esto: assertAll() . Como primer argumento, se necesita escribir un comentario en el registro y luego cualquier número de funciones de aserción.

Así es como nuestro ejemplo se reescribiría con él:

Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
    () -> assertEquals("Washington", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

Luego, si la dirección es incorrecta, se escribirá algo como esto en el registro:

	Complex scenario comparison address (3 failures)
	expected: <Washington> but was: <Seattle>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4 Método de aserción de tiempo de espera

¿ Recuerdas la anotación @Timeout ? Permitió controlar el tiempo de ejecución de todo el método. Pero a veces es útil establecer restricciones en la ejecución de alguna parte del código dentro del método. Puede usar assertTimeout() para esto .

El tiempo se pasa como el primer parámetro, y el código (función) que debe ejecutarse dentro del tiempo especificado se pasa como el segundo. Ejemplo:

@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// pause for one second
    	Thread.sleep(1000);
  	}
	);
}

La clase Assert tiene 12 variantes del método assertTimeout() . Si quieres saber más sobre ellos, bienvenido a la documentación oficial .

6.5 método de aserción de lanzamientos

Muy a menudo, hay situaciones en las que necesita asegurarse de que, en una determinada situación, el código arroje la excepción correcta: detecta un error y lanza la excepción correcta. Esta es una situación muy común.

En este caso, hay otro método de aserción útil : es assertThrows() . El formato general de su convocatoria es:

assertThrows(exception , code)

Básicamente, es muy similar al método assertTimeout() , solo que verifica que el código especificado arroje la excepción correcta. Ejemplo:

@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}