Saltar al contenido principal
Página

Tema 2.3 - Hamcrest

Hamcrest es conocido como un framework que ayuda a realizar pruebas unitarias a través de matchers. Está incluido en JUnit y permite crear coincidencias de aserción personalizadas permitiendo de esta manera tener un lenguaje más claro con relación a los asserts de JUnit. Al admitir la creación de coincidencias de aserción personalizadas, las reglas de coincidencia se definen de forma declarativa, por ejemplo, mientras que la declaración con JUnit es assert not null objeto (afirma no nulo objeto) con el uso de Hamcrest sería assert that objeto is not null (afirma que objeto no es nulo), como ven, la manera de escribirlo y leerlo es más intuitiva con relación a JUnit.

A diferencia del uso de los diferentes asserts que tiene JUnit, hamcrest solo usa uno, assertThat, que permite combinación con los diferentes matchers que componen al framework. A modo de ilustración, se mostraran los matchers más usados cuando se van a realizar pruebas unitarias y un ejemplo por cada uno.

Para hacer uso de hamcrest en JUnit5, se debe asegurar que tenga los siguientes import

import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.*;


Nota: Todos los ejemplos de prueba a continuación, ejecutados con JUnit arrojan un resultado exitoso.

Clasificación

Matchers

Descripción

Código

Base

Is

Este no agrega ningún comportamiento adicional al matcher

	@Test
	void testEjemploIs() {
		//Definición de variables
		String variable1="Hamcrest";
		String variable2="Hamcrest";
		
		//Afirma que variable1 es variable2
		assertThat("hola", is("hola"));
		//Afirma que variable1 igual a variable2
		assertThat(variable1, equalTo(variable2));
		//Afirma que variable1 es igual a variable2
		assertThat(variable1, is(equalTo(variable2)));
	}

 

 

not

Da por válida la prueba si los objetos no coinciden

	@Test
	void testEjemploNot() {
		//Definición de variables
		int numero1=3;
		int numero2=2;
		
		//Afirma que numero1 no es numero2
		assertThat(numero1, is (not(numero2)));
	}

 

Objetos

is-equalTo

Compara ambos objetos mediante el método Object.equals(). En el caso especial de pasar un Array este matcher dará positivo si ambos arrays tienen la misma longitud y objetos lógicamente coincidentes en las mismas posiciones. is(Tipo x) es una abreviatura para is(equalTo(Tipo x)).

	@Test
	void testEjemploIsEqualTo() {
		//Definición de variables
		//Array
		String [] nombresGrupo1 = new String [] {"Ana", "Rosa", "Jorge", "Juan"};
		String [] nombresGrupo2 = new String [] {"Ana", "Rosa", "Jorge", "Juan"};
		//Objeto
		Libro lib = new Libro("Cien años de soledad", "Gabriel García Márquez",
				"13: 9780307474728");
		Libro lib2 = new Libro("Canto General", "Pablo Neruda", " 10: 8432222968 ");
		
		//Afirma que nombresGrupo1 no es igual a nombresGrupo2
		assertThat(nombresGrupo1, is(equalTo(nombresGrupo2)));
		//Afirma que lib es igual a lib2
		assertThat(lib, not(is(equalTo(lib2))));
	}
	

 

 

sameInstance

Comprueba que ambos objetos son la misma instancia

	@Test
	void testEjemploSameInstance() {
		//Definición de variables
		Libro lib = new Libro("Cien años de soledad", "Gabriel García Márquez", 
				"13: 9780307474728");
		Libro lib2 = new Libro("Canto General", "Pablo Neruda", " 10: 8432222968 ");
		Libro lib3=lib;
		//afirma que lib es misma instancia lib2
		assertThat(lib, is(sameInstance(lib3)));
	}
	

 

Cadenas

startsWith

Evalúa si la cadena examinada comienza con la subcadena pasada

	@Test
	void testEjemploStartsWith() {
		//Definición de variables
		String cadena1="Colombia y su política";
		String aBuscar="Colombia";
		
		//Afirma que cadena1 empieza con aBuscar
		assertThat(cadena1, startsWith(aBuscar));
	}
	

 

 

endsWith

Evalúa si la cadena examinada termina con la subcadena pasada

	@Test
	void testEjemploEndssWith() {
		//Definición de variables
		String cadena1="Colombia y su política";
		String aBuscar="política";
		
		//Afirma que cadena1 termina con aBuscar
		assertThat(cadena1, endsWith(aBuscar));
	}
	

 

 

containsString

Busca la cadena pasada en cualquier posición de la cadena principal

	@Test
	void testEjemploConstrainsString() {
		//Definición de variables
		String cadena1="Colombia y su política";
		String aBuscar="política";
		
		//Afirma que cadena1 contiene la cadena aBuscar
		assertThat(cadena1, containsString(aBuscar));
	}

 

Booleanos

allOf

Da por válida la prueba si todos los matchers coinciden. Similar al operador && de java

	@Test
	void testEjemploAllOf() {
		//Definición de variables
		String cadena1="Colombia y su política";
		String comienzo= "Colombia";
		String fin="política";
		
		//Afirma que cadena1 toda comienza con comienzo, termina con fin
		assertThat(cadena1, allOf(startsWith(comienzo),endsWith(fin)));
	}

 

 

anyOf

Da la prueba por válida si alguno de los matchers que abarca coincide. Parecido al operador || en java.

	@Test
	void testEjemploAnyOf() {
		//Definición de variables
		String cadena1="Colombia y su política";
		String comienzo= "Colombia";
		String fin="cultura";
		
		
		assertThat(cadena1, anyOf(startsWith(comienzo),endsWith(fin)));
	}

 

 

both

Da la prueba por válida si se cumple ambas condiciones

	@Test
	void testEjemploBoth() {
		//Definición de variables
		String cadena1="Colombia y su política";
		String comienzo= "Colombia";
		String fin="política";
		
		
		assertThat(cadena1, both(startsWith(comienzo)).and(endsWith(fin)));
	}

 

 

either

El matcher creado da la prueba por válida si cumple al menos una de las condiciones

	@Test
	void testEjemploEither() {
		//Definición de variables
		String cadena1="Colombia y su política";
		String comienzo= "Colombia";
		String fin="política";
		
		
		assertThat(cadena1, either(startsWith(comienzo)).or(endsWith(fin)));
	}

 

Colecciones

hasItem

Crea un matcher para elementos iterables, dando solo un solo ciclo con el elemento a buscar deteniéndose cuando encuentra una ocurrencia.

	@Test
	void testEjemploHasItem() {
		//Definición de variables
		ArrayList<String> nombres = new ArrayList<String>() ;
		nombres.add("Juan");
		nombres.add("Maria");
		nombres.add("Jose");
		String nombreABuscar="Jose";
		
		//afirma que nombres, tiene item nombreABuscar
		assertThat(nombres, hasItem(nombreABuscar));
	}

 

 

hasItems

El número de pases es proporcional al número de elementos a buscar. Se detiene al momento de encontrar la primera ocurrencia

	@Test
	void testEjemploHasItems() {
		//Definición de variables
		ArrayList<String> nombres = new ArrayList<String>() ;
		nombres.add("Juan");
		nombres.add("Maria");
		nombres.add("Jose");
		String nombre1="Jose";
		String nombre2="Juan";
		
		//afirma que nombres, tiene los items nombre1,nombre2
		assertThat(nombres, hasItems(nombre1, nombre2));
	}

 


Última modificación: martes, 1 de septiembre de 2020, 21:30