matchers java junit hamcrest

java - hamcrest matchers



¿Cómo usar JUnit y Hamcrest juntos? (7)

¿Por qué JUnit incluyó el paquete org.hamcrest en su propia distribución en lugar de animarnos a usar la biblioteca original de Hamcrest?

Supongo que es porque querían que assertThat fuera parte de JUnit. Eso significa que la clase Assert tiene que importar la interfaz org.hamcrest.Matcher y no puede hacerlo a menos que JUnit dependa de Hamcrest o incluya (al menos parte de) Hamcrest. Y supongo que incluir parte de esto fue más fácil, por lo que JUnit sería utilizable sin ninguna dependencia.

No puedo entender cómo JUnit 4.8 debería funcionar con los adaptadores de Hamcrest. Hay algunos matchers definidos dentro de junit-4.8.jar en org.hamcrest.CoreMatchers . Al mismo tiempo, hay algunos otros mezcladores en hamcrest-all-1.1.jar en org.hamcrest.Matchers . Entonces, ¿a dónde ir? ¿Incluiré explícitamente hamcrest JAR en el proyecto e ignoraré los matchers proporcionados por JUnit?

En particular, estoy interesado en empty() matcher y no puedo encontrarlo en ninguno de estos archivos jar. Necesito algo más? :)

Y una pregunta filosófica: ¿por qué JUnit incluyó el paquete org.hamcrest en su propia distribución en lugar de animarnos a usar la biblioteca original de Hamcrest?


Además, si se usa JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5, asegúrese de que no se use mockito-all. Contiene clases básicas de Hamcrest. Utilice el mockito-core en su lugar. La siguiente configuración funciona:

<dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>hamcrest-core</artifactId> <groupId>org.hamcrest</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.1.1</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>hamcrest-core</artifactId> <groupId>org.hamcrest</groupId> </exclusion> </exclusions> </dependency>


Dado que las versiones cambian todo el tiempo, estoy publicando para que la gente sepa que a partir del 2 de diciembre de 2014, las instrucciones en http://www.javacodegeeks.com/2014/03/how-to-test-dependencies-in-a-maven-project-junit-mockito-hamcrest-assertj.html funcionó para mí. No usé AssertJ, solo estos:

<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.objenesis</groupId> <artifactId>objenesis</artifactId> <version>1.3</version> <scope>test</scope> </dependency>


No respondiste exactamente tu pregunta, pero definitivamente debes probar la API FEST-Assert fluent assertions. Está compitiendo con Hamcrest, pero tiene una API mucho más fácil con solo una importación estática requerida. Aquí está el código provisto por cpater usando FEST:

package com.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import static org.fest.assertions.Assertions.assertThat; public class EmptyTest { @Test public void testIsEmpty() { List myList = new ArrayList(); assertThat(myList).isEmpty(); } }

EDITAR: coordenadas de Maven:

<dependency> <groupId>org.easytesting</groupId> <artifactId>fest-assert</artifactId> <version>1.4</version> <scope>test</scope> </dependency>


Si está utilizando un Hamcrest con una versión mayor o igual a 1.2, entonces debe usar el junit-dep.jar . Este jar no tiene clases de Hamcrest y por lo tanto evita problemas de carga de clases.

Desde JUnit 4.11 el junit.jar sí no tiene clases de Hamcrest. Ya no hay necesidad de junit-dep.jar .


Tanto JUnit-4.12 como JUnit-Dep-4.10 tienen dependencias de Hamcrest según los respectivos archivos .xml.

La investigación adicional muestra que, aunque la dependencia se realizó en los archivos .xml, la fuente y las clases en los archivos jar. Parece ser una forma de excluir la dependencia en build.gradle ... probándolo para mantener todo limpio.

Solo un fyi


junit proporciona nuevos métodos de confirmación de verificación llamados assertThat () que usa Matchers y debe proporcionar un código de prueba más legible y mejores mensajes de falla.

Para usar esto, hay algunos matchers centrales incluidos en junit. Puede comenzar con estos para pruebas básicas.

Si desea utilizar más mezcladores, puede escribirlos usted mismo o usar Hamcrest lib.

El siguiente ejemplo muestra cómo usar el matcher vacío en una ArrayList:

package com.test; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class EmptyTest { @Test public void testIsEmpty() { List myList = new ArrayList(); assertThat(myList, is(empty())); } }

(Incluí el hamcrest-all.jar en mi buildpath)