No puedo entender cómo debería funcionar JUnit 4.8 con los comparadores Hamcrest. Hay algunos matchers definidos dentro junit-4.8.jar
de org.hamcrest.CoreMatchers
. Al mismo tiempo, hay otros comparadores hamcrest-all-1.1.jar
en org.hamcrest.Matchers
. Entonces, ¿adónde ir? ¿Debo incluir explícitamente hamcrest JAR en el proyecto e ignorar los emparejadores proporcionados por JUnit?
En particular, estoy interesado en el empty()
emparejador y no puedo encontrarlo en ninguno de estos frascos. Necesito algo mas :)
Y una pregunta filosófica: ¿por qué JUnit incluyó el org.hamcrest
paquete en su propia distribución en lugar de alentarnos a usar la biblioteca original de Hamcrest?
org.hamcrest.Matchers.empty()
se encuentra exactamente ? ¿Podría dar un enlace al archivo JAR?Si está usando 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
mismo no tiene clases de Hamcrest. Ya no es necesariojunit-dep.jar
.fuente
No responde exactamente a su pregunta, pero definitivamente debería probar la API de aserciones fluidas FEST-Assert . Está compitiendo con Hamcrest, pero tiene una API mucho más sencilla con solo una importación estática requerida. Aquí está el código proporcionado 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>
fuente
Además, si se está utilizando JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5, asegúrese de que no se utilice mockito-all. Contiene clases básicas de Hamcrest. En su lugar, utilice mockito-core. 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>
fuente
Dado que las versiones cambian todo el tiempo, publico para que la gente sepa que a partir del 2 de diciembre de 2014, las instrucciones se encuentran en http://www.javacodegeeks.com/2014/03/how-to-test-dependencies-in -a-maven-project-junit-mockito-hamcrest-assertj.html funcionó para mí. Sin embargo, 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>
fuente
Supongo que es porque querían
assertThat
formar parte de JUnit. Eso significa que laAssert
clase tiene que importar laorg.hamcrest.Matcher
interfaz y no puede hacerlo a menos que JUnit dependa de Hamcrest o incluya (al menos parte de) Hamcrest. Y supongo que incluir parte de él fue más fácil, por lo que JUnit podría usarse sin dependencias.fuente
En 2018 utilizando la mayoría de las bibliotecas modernas:
configurations { all { testCompile.exclude group: "org.hamcrest", module: "hamcrest-core" testCompile.exclude group: "org.hamcrest", module: "hamcrest-library" } } dependencies { testCompile("junit:junit:4.12") // testCompile("org.hamcrest:hamcrest-library:1.3") // testCompile("org.hamcrest:java-hamcrest:2.0.0.0") testCompile("org.hamcrest:hamcrest-junit:2.0.0.0") }
fuente
Tanto JUnit-4.12 como JUnit-Dep-4.10 tienen dependencias de Hamcrest de acuerdo con los respectivos archivos .xml.
Una 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
fuente