Comment utiliser JUnit et Hamcrest ensemble?

Je ne comprends pas comment JUnit 4.8 devrait fonctionner avec Hamcrest matchers. Il y a quelques matches définis à l'intérieur de junit-4.8.jar dans org.hamcrest.CoreMatchers . En même temps il y a quelques autres matchers dans hamcrest-all-1.1.jar dans org.hamcrest.Matchers . Alors, où aller? Dois-je inclure explicitement hamcrest JAR dans le projet et ignorer les matchers fournis par JUnit?

en particulier, je suis intéressé par empty() matcher et ne peut pas le trouver dans l'un de ces pots. J'ai besoin de quelque chose d'autre? :)

et une question philosophique: pourquoi JUnit a inclus org.hamcrest paquet dans sa propre distribution au lieu de nous encourager à utiliser la bibliothèque originale hamcrest?

83
demandé sur yegor256 2011-04-06 19:56:58

8 réponses

junit fournit de nouvelles méthodes d'assertions de contrôle nommées assertThat () qui utilisent des Matchers et devraient fournir un code de test plus lisible et de meilleurs messages de défaillance.

pour utiliser ceci, il y a des connecteurs de base inclus dans junit. Vous pouvez commencer avec ceux-ci pour les tests de base.

si vous voulez utiliser plus de paillassons, vous pouvez les écrire vous-même ou utiliser le hamcrest lib.

L'exemple suivant montre comment utiliser le vide matcher sur une liste de tableaux:

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 hamcrest-all.jar dans mon buildpath)

46
répondu cpater 2011-04-06 16:29:55

si vous utilisez un Hamcrest avec une version supérieure ou égale à 1.2, vous devez utiliser le junit-dep.jar . Ce bocal n'a pas de classe Hamcrest et donc vous évitez les problèmes de chargement de classe.

depuis le 11 juin le junit.jar lui-même n'a pas de classes Hamcrest. Il n'y a plus besoin de junit-dep.jar .

49
répondu Stefan Birkner 2013-02-24 18:22:21

pas exactement répondre à votre question, mais vous devriez certainement essayer FEST-Assert assertions fluent API. Il est en concurrence avec Hamcrest, mais dispose d'une API beaucoup plus facile avec une seule importation statique nécessaire. 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();
    }  
}

modifier: coordonnées Maven:

<dependency>
  <groupId>org.easytesting</groupId>
  <artifactId>fest-assert</artifactId>
  <version>1.4</version>
  <scope>test</scope>
</dependency>
24
répondu Tomasz Nurkiewicz 2011-04-06 17:57:23

aussi, si JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5 sont utilisés, assurez-vous mockito-all n'est pas utilisé. Il contient les classes principales de Hamcrest. Utilisez mockito-core à la place. 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>
17
répondu souser 2015-03-30 19:23:53

étant donné que les versions changent constamment, je poste pour informer les gens qu'à partir du 2 décembre 2014, les instructions à http://www.javacodegeeks.com/2014/03/how-to-test-dependencies-in-a-maven-project-junit-mockito-hamcrest-assertj.html travaillait pour moi. Je n'ai pas utilisé AssertJ cependant, 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>
4
répondu Michael Osofsky 2014-12-02 17:47:57

pourquoi JUnit inclus org.hamcrest package dans sa propre distribution au lieu de nous encourager à utiliser la bibliothèque originale de hamcrest?

je suppose que c'est parce qu'ils voulaient que le assertThat fasse partie de JUnit. Cela signifie donc que la classe Assert doit importer l'interface org.hamcrest.Matcher et elle ne peut pas le faire à moins que JUnit ne dépende de Hamcrest, ou inclut (au moins une partie de) Hamcrest. Et je pense notamment à la partie des il a plus facile, pour que JUnit soit utilisable sans aucune dépendance.

3
répondu MatrixFrog 2011-06-30 00:19:32

les deux JUnit-4.12 et JUnit-Dep-4.10 ont des dépendances de Hamcrest selon les respectives .des fichiers xml.

une enquête plus approfondie montre que, bien que la dépendance ait été faite dans le .les fichiers xml, la source et les classes dans les bocaux. Le semble être une manière d'exclure la dépendance dans la construction.gradle ... tester de garder tout propre.

juste un F. Y. I.

0
répondu cyclops3324911 2015-09-12 01:25:38

en 2018 en utilisant les bibliothèques les plus 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")
}
0
répondu gavenkoa 2018-09-29 22:49:20