2011-04-06 16 views
80

No entiendo cómo debería funcionar JUnit 4.8 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 emparejamientos 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?¿Cómo usar JUnit y Hamcrest juntos?

En particular, estoy interesado en empty() matcher y no lo puedo encontrar en ninguno de estos frascos. 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?

Respuesta

46

junit proporciona nuevos métodos de confirmación de verificación llamados assertThat() que utiliza 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 comparadores, puede escribirlos usted mismo o utilizar el hamcrest lib.

El siguiente ejemplo muestra cómo utilizar el matcher vacío en un 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())); 

    } 
} 

(que incluía el hamcrest-all.jar en mi BuildPath)

+2

donde exactamente 'org.hamcrest.Matchers.empty()' se encuentra? ¿Podría dar un enlace al archivo JAR? – yegor256

+0

Puede encontrarlo todo aquí: http://code.google.com/p/hamcrest/ y la descarga de hamcrest-all.jar aquí: http://code.google.com/p/hamcrest/downloads/detail? name = hamcrest-all-1.2.jar & can = 2 & q = – cpater

+1

Parece que hamcrest 1.2 [no es] (http://code.google.com/p/hamcrest/issues/detail?id=12) en el repositorio de Maven Central. Ese es el problema al que me enfrento :( – yegor256

24

No responder exactamente a su pregunta, pero definitivamente debería probar FEST-Assert API de afirmaciones fluidas. 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 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(); 
    } 
} 

EDIT: coordenadas Maven:

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

¡de hecho, parece interesante! – yegor256

+3

Acabo de cambiar mi biblioteca de afirmaciones. Estaba bastante satisfecho con hamcrest, pero porque de las cosas problemáticas de inclusión de junit y algunas pruebas difíciles de escribir (con colección y genéricos), ¡estoy enamorado de FEST! Gracias por compartir. – Guillaume

+4

Bump - FEST ahora es hasta 2.0x. https://github.com/alexruiz/fest-assert-2.x/wiki –

3

qué JUnit incluido paquete org.hamcrest en su propia distribución en lugar de animarnos a utilizar biblioteca original de Hamcrest?

Supongo que es porque querían que el 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.

48

Si está utilizando un Hamcrest con una versión mayor o igual que 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 en sí no tiene clases de Hamcrest. Ya no hay necesidad de junit-dep.jar.

+2

Parece que a partir de JUnit 4.12, ya no existe un junit-dep.jar. Es ese el caso? Y si es así, ¿estamos destinados a usar el frasco independiente Hamcrest 1.3? –

+1

Responda a ambas preguntas: sí. –

17

Además, si JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5 se están utilizando, asegúrese de que no se utilice el simulacro. Contiene clases básicas de Hamcrest. Utilice el mockito-core en su lugar. La configuración siguiente 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> 
4

Desde versiones están cambiando todo el tiempo, les dejo que la gente sepa que al 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 trabajaron para mí. Yo no utilizar AssertJ sin embargo, sólo éstos:

<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> 
0

Tanto JUnit JUnit-4.12 y 4.10-Dep-Hamcrest tiene dependencias de acuerdo a 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.

Sólo un f.y.i.

+0

No entiendo tu segundo párrafo. Creo que podrías haber omitido algunas palabras de lo que querías escribir. –

Cuestiones relacionadas