Tipos de assertions en JUnit 5

Assertions en JUnit5

Assertions en JUnit5


En este artículo vamos a ver los diferentes tipos de assertions en JUnit 5 que podemos aplicar en nuestra fase de test en nuestas aplicaciones.

¿Qué son las asserciones (assertions) en JUnit 5?

Las asserciones son métodos que nos permiten afirmar el resultado de una operación. Estos métodos son proporcionados por la clase Assertions en JUnit 5.

assertEquals(2, 2);

Tipos de Assertions en JUnit 5

Las assertions en JUnit 5 permiten comprobar todos los tipos primitivos además se apoya en las funcionalidades introducidas en Java 8 con lo que el mensaje de salida del assert puede ser un Supplier.

Vamos a ver los diferentes tipos de asserts que podemos encontrar en JUnit 5.

assertNotEquals en JUnit 5

El método assertNotEquals nos permite verificar que el valor esperado y valor actual son diferentes.

@Test
void when_assert_two_values_then_assert_not_equals() {
    String hi = "hi"; 
    
    assertNotEquals("bye", hi, "Value is different than "bye");
}

assertEquals en JUnit 5

El método assertEquals funciona a la inversa que el assertNotEquals, es decir, verifica que el valor esperado y el actual son iguales.

@Test
void when_assert_two_values_then_assert_are_equals() {
    String hi = "hi"; 
    
    assertEquals("hi", hi);
}

Una característica importante del assertEquals es que nos permite añadir un valor Delta que establece una diferencia entre el valor esperado y el actual.

@Test
void when_assert_2_times_pi_then_assert_has_delta() {
    Double pi = 3.14; 
    Double piDouble = pi*2;

    Double delta = 0.28;

    assertEquals(6, piDouble, delta);
}

assertArrayEquals con JUnit 5

El assertArrayEquals nos permite verificar si el array esperado es igual que el array actual.

@Test
public void when_assert_two_arrays_then_are_equals() {
    
    char[] expected = "Pepito".toCharArray();
    
    char[] actual = { 'P', 'e', 'p', 'i', 't', 'o' };


    assertArrayEquals(expected, actual, "Pepito arrays are not equals");
}

Uso de assertTrue

AssertTrue nos permite verificar que una condición entre valor actual y el esperado es true.

@Test
public void when_assert_two_values_then_are_equals() {
    
    int expected = 7;
    
    int actual = 5+2;

    assertTrue(expected, actual, "Values are equals");
}

Como hemos comentado anteriormente, assert en JUnit 5 se apoya en las expresiones lambda, por lo que el assert anterior lo podríamos indicar de la siguiente manera:

@Test
public void when_assert_two_values_then_are_equals() {
    
    int expected = 7;
    
    int actual = 5+2;

    BooleanSupplier condition = () -> expected > actual;

    assertTrue(condition, "expected and actual are equals");
}

Uso de assertFalse

AssertFalse en JUnit 5 funciona a la inversa que assertTrue, es decir, asegura que dos valores (esperado y actual) son diferentes.

@Test
public void when_assert_two_values_then_are_equals() {
    
    int expected = 77;
    
    int actual = 5+2;

    assertFalse(expected, actual, "Values are not equals");
}

assertNotNull en JUnit 5

El assertNotNull nos permite asegurar que el valor actual es distinto de null.

@Test
void when_assert_not_null_then_not_null_value() {
    String sayHi = "hi";

    assertNotNull(sayHi, () -> "Value cannot be null");
}

assertNull

assertNull en JUnit 5 es utilizado para asegurar que el valor que queremos verificar es null.

@Test
void when_assert_null_then_null_value() {
    String sayHi = null;

    assertNotNull(sayHi, () -> "Value must be null");
}

assertSame en Junit 5

AssertSame es utilizado para referenciar que dos objetos hacen referencia al mismo objeto, vamos a verlo mejor con un ejemplo:

    @Test
    public void given_two_string_when_assert_same_then_assert_is_true(){
    	
        String cityA ="Spain";
    	String cityAA ="Spain";
    	Assertions.assertSame(cityA,cityAA);
    }
    
    @Test
    public void given_two_string_when_assert_same_then_assert_is_false(){
    	
        String cityA ="Spain";
    	String cityAA ="Spain";
    	Assertions.assertSame(cityA,cityAA, "cityA and cityAA do not refer to same object"););
    }

assertNotSame

AssertNotSame es uno de los tipos de assert en JUnit 5 que nos permite asegurar que dos objetos hacen referencia a diferentes objetos. Es igual que el funcionamiento de assertSame pero al revés.

    @Test
    public void given_two_string_when_assert_not_same_then_assert_is_true(){
    	
        String cityA ="Spain";
    	String cityAA ="France";
    	Assertions.assertNotSame(cityA,cityAA);
    }

assertAll

AssertAll es una característica introducida en JUnit 5, la cual nos permite agrupar los assertions en grupos.

@Test
void given_multiples_number_when_assert_all_then_every_assert_is_ok() {
    int value = 5;
    assertAll(
      "heading",
      () -> assertEquals(10, 5+5),
      () -> assertEquals(5, value),
      () -> assertNotNull(value)
    );
}

assertIterableEquals en JUnit 5

El assertIterableEquals funciona de la misma manera que el assertArrayEquals con la única diferencia que va enfocado al objeto Iterable.

assertLinesMatch

Hace assert si dos listas de String son iguales, se diferencia con assertEquals y assertIterableEquals en :

  • Realiza la comprobación expected.equals(actual)
  • Utiliza el método String.matches() para tratar la línea como expresión regular.
  • Compruebe si la línea esperada es un marcador fast-forward. En caso afirmativo, se aplica el avance rápido y repetimos desde el punto 1.

Un marcador fast-forward es una cadena que comienza y termina con >> y tiene al menos cuatro caracteres. Si hay caracteres entre los literales se descarta.

	@Test
	void given_values_to_compare_when_assert_lines_match_then_true() {

		List<String> expected = asList("Blue", "\\w+", "Sun");

		List<String> actual = asList("Blue", "hola", "Sun");

		assertLinesMatch(expected, actual);
	}

En el caso anterior pasamos una expresión regular que acepta cualquier palabra, por lo que al comparar \\w+ con «hola» el resultado es true.

assertThrows

Nos permite validar si con determinado valor nuestro código lanzará alguna excepción.

	@Test
	public void given_wrong_values_when_parse_to_int_then_throw_exception() {

		Exception exception = assertThrows(ArithmeticException.class, () -> {
			int value = 5/0;
		});

		String expectedMessage = "/ by zero";
		String actualMessage = exception.getMessage();

		assertTrue(actualMessage.contains(expectedMessage));
	}

Ejemplo de assertTimeout en JUnit 5

El tipo de assertions en JUnit 5 de assertTimeout nos permite verificar si nuestro código dará algún tipo de timeout en un determinado tiempo.

	@Test
	void given_1_second_of_time_out_when_request_process_then_return_true() {
		assertTimeout(ofSeconds(1),
				() -> {
					Thread.sleep(100);
				}
		);
	}

 assertTimeoutPreemptively en JUnit 5

La única diferencia de assertTimeoutPreemptively con assertTimeout, es que si assertTimeoutPreemptively la ejecución del Executable o ThrowingSupllier se cancela si se excede un tiempo de espera.

	@Test
	void given_1_second_of_time_out_preemptively_when_request_process_then_return_true() {
		assertTimeoutPreemptively(ofSeconds(1),
				() -> {
					Thread.sleep(100);
				}
		);
	}

Al aplicar este assertion conseguimos que el executable no se siga ejecutando.

Conclusión de tipos de assertions en JUnit 5

En esta entrada hemos visto los diferentes tipos de assertions en JUnit 5, lo que nos ayudará en nuestros test.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *