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)); }
|