89 votes

Comment utiliser JUnit et Hamcrest ensemble?

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

En particulier, je suis intéressé en empty() matcher et ne peut pas trouver dans n'importe lequel de ces jarres. J'ai besoin de quelque chose d'autre? :)

Et une question philosophique: pourquoi JUnit incluses org.hamcrest paquet dans son propre réseau de distribution au lieu de nous encourager à utiliser d'origine hamcrest bibliothèque?

51voto

Stefan Birkner Points 3080

Si vous utilisez un Hamcrest avec une version supérieure ou égale à 1.2, alors vous devriez utiliser l' junit-dep.jar. Ce pot n'a pas de Hamcrest classes et, par conséquent, vous évitez classloading problèmes.

Depuis JUnit 4.11 junit.jar lui-même n'a pas de Hamcrest classes. Il n'est pas nécessaire pour junit-dep.jar plus.

49voto

cpater Points 561

junit offre de nouvelles vérifier affirmer méthodes nommées assertThat() qui utilise les allumettes et devrait fournir un plus lisible testcode et de meilleurs messages d'échec.

Pour utiliser cela, il ya un certain noyau de rapprochement inclus dans junit. Vous pouvez commencer avec ces pour des tests de base.

Si vous souhaitez utiliser plus de rapprochement, vous pouvez leur écrire par 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 la hamcrest-all.jar dans mon buildpath)

25voto

Tomasz Nurkiewicz Points 140462

Pas exactement répondre à votre question, mais vous devriez certainement essayer FEST-Assert couramment affirmations de l'API. Il est en concurrence avec Hamcrest, mais est beaucoup plus facile de l'API avec un seul statique d'importation nécessaires. Voici le code fourni par cpater à l'aide de 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: Maven coordonnées:

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

18voto

souser Points 304

Aussi, si JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5 sont utilisés, assurez-vous que mockito-tout n'est pas utilisée. Il contient Hamcrest des classes de base. Utilisation mockito-core à la place. Ci-dessous la config 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>

3voto

MatrixFrog Points 11066

pourquoi JUnit inclus org.hamcrest paquet dans son propre réseau de distribution au lieu de nous encourager à utiliser d'origine hamcrest bibliothèque?

Je suppose que c'est parce qu'ils voulaient l' assertThat à faire partie de JUnit. Donc cela signifie que l' Assert de la classe a à l'importation de l' org.hamcrest.Matcher interface et il ne peut pas le faire à moins que JUnit soit dépend Hamcrest, ou comprend (au moins en partie) Hamcrest. Et je pense notamment à la partie de lui était plus facile, de sorte que JUnit serait utilisable sans dépendances.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X