it-swarm.com.de

Wie benutze ich JUnit und Hamcrest zusammen?

Ich kann nicht verstehen, wie JUnit 4.8 mit Hamcrest-Matchern zusammenarbeiten soll. Es gibt einige Matcher, die in junit-4.8.jar in org.hamcrest.CoreMatchers definiert sind. Zur gleichen Zeit gibt es einige andere Matcher in hamcrest-all-1.1.jar in org.hamcrest.Matchers. Wohin also? Soll ich hamcrest JAR explizit in das Projekt einbeziehen und von JUnit bereitgestellte Matcher ignorieren?

Ich interessiere mich besonders für empty() matcher und kann ihn in keinem dieser Gläser finden. Brauche ich noch etwas? :)

Und eine philosophische Frage: Warum hat JUnit das org.hamcrest-Paket in seine eigene Distribution aufgenommen, anstatt uns zu ermutigen, die ursprüngliche Hamcrest-Bibliothek zu verwenden?

83
yegor256

junit bietet neue check-assert-Methoden mit dem Namen assertThat () an, die Matchers verwenden und einen besser lesbaren Testcode und bessere Fehlermeldungen liefern.

Um dies zu nutzen, enthält Junit einige wichtige Matcher. Sie können mit diesen für grundlegende Tests beginnen.

Wenn Sie mehr Matcher verwenden möchten, können Sie diese selbst schreiben oder die Hamcrest-Bibliothek verwenden.

Das folgende Beispiel veranschaulicht die Verwendung des leeren Matchers für eine 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()));

    }
}

(Ich habe den hamcrest-all.jar in meinen Baupfad aufgenommen)

46
cpater

Wenn Sie einen Hamcrest mit einer Version größer oder gleich 1.2 verwenden, sollten Sie den junit-dep.jar verwenden. Dieses Glas hat keine Hamcrest-Klassen und daher vermeiden Sie Probleme beim Laden von Klassen.

Seit JUnit 4.11 verfügt junit.jar selbst über keine Hamcrest-Klassen. junit-dep.jar ist nicht mehr erforderlich.

49
Stefan Birkner

Ihre Frage nicht genau beantworten, aber Sie sollten auf jeden Fall FEST-Assert fließende Assertions-API versuchen. Es konkurriert mit Hamcrest, hat aber eine viel einfachere API mit nur einem statischen Import. Hier ist der Code, der von cpater mit FEST bereitgestellt wird:

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-Koordinaten:

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

Wenn Sie JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5 verwenden, stellen Sie sicher, dass kein Mockito-all verwendet wird. Es enthält Hamcrest-Kernklassen. Verwenden Sie stattdessen mockito-core . Die folgende Konfiguration funktioniert:

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

Da sich die Versionen ständig ändern, werde ich die Benutzer darüber informieren, dass ab dem 2. Dezember 2014 die Anweisungen unter http://www.javacodegeeks.com/2014/03/how-to-test-dependencies verfügbar sind -in-a-maven-projekt-junit-mockito-hamcrest-assertj.html arbeitete für mich. Ich habe AssertJ jedoch nicht verwendet, nur diese:

<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
Michael Osofsky

warum hat JUnit das org.hamcrest-Paket in seine eigene Distribution aufgenommen, anstatt uns zu ermutigen, die originale hamcrest-Bibliothek zu verwenden?

Ich denke, das liegt daran, dass sie wollten, dass die assertThat Teil von JUnit ist. Das bedeutet, dass die Assert-Klasse die org.hamcrest.Matcher-Schnittstelle importieren muss. Dies ist jedoch nur möglich, wenn JUnit entweder von Hamcrest abhängig ist oder (zumindest einen Teil von) Hamcrest enthält. Ich glaube, ein Teil davon war einfacher, sodass JUnit ohne Abhängigkeiten verwendet werden konnte.

3
MatrixFrog

Sowohl JUnit-4.12 als auch JUnit-Dep-4.10 haben Hamcrest-Abhängigkeiten gemäß den jeweiligen XML-Dateien.

Weitere Untersuchungen zeigen, dass zwar die Abhängigkeit von den XML-Dateien, die Quelle und die Klassen in den Gläsern gemacht wurden. Das scheint eine Möglichkeit zu sein, die Abhängigkeit in build.gradle ... auszuschließen, um alles sauber zu halten.

Nur ein f.y.i.

0
cyclops3324911

2018 mit den meisten modernen Bibliotheken:

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
gavenkoa