Je ne comprends pas comment JUnit 4.8 devrait fonctionner avec les matchers de Hamcrest. Il existe des correspondants définis dans junit-4.8.jar
in org.hamcrest.CoreMatchers
. En même temps, il y a quelques autres correspondants dans hamcrest-all-1.1.jar
in org.hamcrest.Matchers
. Alors, où aller? Dois-je explicitement inclure JAR hamcrest dans le projet et ignorer les agents de correspondance fournis par JUnit?
En particulier, je m'intéresse à empty()
matcher et je ne le trouve dans aucun de ces pots. J'ai besoin de quelque chose d'autre? :)
Et une question philosophique: pourquoi JUnit a inclus le package org.hamcrest
dans sa propre distribution au lieu de nous encourager à utiliser la bibliothèque originale de hamcrest?
junit fournit de nouvelles méthodes d’assert de vérification nommées assertThat () qui utilisent des Matchers et devraient fournir un code de test plus lisible et de meilleurs messages d’échec.
Pour utiliser cela, il y a quelques joueurs de base inclus dans Junit. Vous pouvez commencer avec ceux-ci pour les tests de base.
Si vous voulez utiliser plus d’adaptateurs, vous pouvez les écrire vous-même ou utiliser la bibliothèque hamcrest.
L'exemple suivant montre comment utiliser le matcher vide sur 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()));
}
}
(J'ai inclus le fichier hamcrest-all.jar dans mon chemin de construction)
Si vous utilisez un Hamcrest avec une version supérieure ou égale à 1.2, vous devez utiliser le junit-dep.jar
. Ce fichier n'a pas de classe Hamcrest et vous évitez donc les problèmes de chargement de classe.
Depuis JUnit 4.11, le junit.jar
lui-même n'a pas de classe Hamcrest. junit-dep.jar
n'est plus nécessaire.
Vous ne répondez pas exactement à votre question, mais vous devez absolument essayer FEST-Assert fluent assertions API. Il est en concurrence avec Hamcrest, mais a une API beaucoup plus facile avec une seule importation statique requise. Voici le code fourni par cpater en utilisant 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: coordonnées Maven:
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert</artifactId>
<version>1.4</version>
<scope>test</scope>
</dependency>
De plus, si JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5 sont utilisés, assurez-vous que mockito-all n’est pas utilisé. Il contient les classes de base de Hamcrest. Utilisez mockito-core à la place de… .. La configuration ci-dessous fonctionne:
<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>
Comme les versions changent tout le temps, je poste pour que les gens sachent qu'à compter du 2 décembre 2014, les instructions à l'adresse http://www.javacodegeeks.com/2014/03/how-to-test-dependencies -in-a-maven-project-junit-mockito-hamcrest-assertj.html a travaillé pour moi. Cependant, je n’ai pas utilisé AssertJ, mais juste ceux-ci:
<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>
pourquoi JUnit a inclus le paquetage org.hamcrest dans sa propre distribution au lieu de nous encourager à utiliser la bibliothèque hamcrest originale?
Je suppose que c'est parce qu'ils voulaient que la assertThat
fasse partie de JUnit. Cela signifie donc que la classe Assert
doit importer l'interface org.hamcrest.Matcher
et ne peut le faire que si JUnit dépend de Hamcrest ou inclut (au moins une partie de) Hamcrest. Et j’imagine qu’en inclure une partie était plus facile, de sorte que JUnit soit utilisable sans aucune dépendance.
JUnit-4.12 et JUnit-Dep-4.10 ont tous deux des dépendances Hamcrest selon les fichiers .xml respectifs.
Un examen plus approfondi montre que, bien que la dépendance ait été faite dans les fichiers .xml, la source et les classes dans les fichiers JAR. Cela semble être un moyen d’exclure la dépendance dans build.gradle ... le tester pour que tout reste propre.
Juste un f.y.i.
En 2018, en utilisant la plupart des bibliothèques modernes:
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")
}