JUnitとHamcrestを一緒に使用する方法は?


87

JUnit 4.8がHamcrestマッチャーとどのように連携するか理解できません。内部で定義されたいくつかのマッチャがあるjunit-4.8.jarではorg.hamcrest.CoreMatchers。同時に、にもいくつかマッチャーがhamcrest-all-1.1.jarありorg.hamcrest.Matchersます。それで、どこへ行くのですか?hamcrest JARをプロジェクトに明示的に含め、JUnitが提供するマッチャーを無視しますか?

特に、私はempty()マッチャーに興味があり、これらのjarのどれにも見つかりません。他に何か必要ですか?:)

そして哲学的な質問:なぜJUnit org.hamcrestはオリジナルのhamcrestライブラリを使用するように勧めるのではなく、独自のディストリビューションにパッケージを含めたのですか?

回答:


49

junitは、Matchersを使用するassertThat()という名前の新しいチェックアサートメソッドを提供し、より読みやすいテストコードとより優れたエラーメッセージを提供します。

これを使用するには、junitにいくつかのコアマッチャーが含まれています。基本的なテストでは、これらから始めることができます。

より多くのマッチャーを使用したい場合は、自分で作成するか、hamcrest libを使用できます。

次の例は、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()));

    }
}

(私は自分のビルドパスにhamcrest-all.jarを含めました)


2
正確にorg.hamcrest.Matchers.empty()はどこにありますか?JARファイルへのリンクをお知らせください。
yegor256 2011

あなたはすべてここに見つけることができます:code.google.com/p/hamcrestとhamcrest-all.jarをここでのダウンロード:code.google.com/p/hamcrest/downloads/...
cpater

1
hamcrest 1.2 Maven Centralリポジトリにないようです。それが私が直面している問題です:(
yegor256

5
Hamcrest 1.3がリリースされ、Maven Centralにあります。
トム


50

1.2以上のバージョンのHamcrestを使用してjunit-dep.jarいる場合は、を使用する必要があります。このjarにはHamcrestクラスがないため、クラスローディングの問題を回避できます。

JUnit 4.11以降、junit.jarそれ自体にはHamcrestクラスがありません。junit-dep.jarもう必要はありません。


2
JUnit 4.12以降、junit-dep.jarはなくなったようです。それは事実ですか?もしそうなら、スタンドアロンのHamcrest 1.3 jarを使用するつもりですか?
Jeff Evans

1
両方の質問に答えてください:はい。
Stefan Birkner、2015年

25

あなたの質問に正確に答えているわけではありませんが、FEST-Assert fluent assertions API をぜひ試してください。これはHamcrestと競合していますが、静的インポートが1つだけ必要な、はるかに簡単なAPIを備えています。以下は、FESTを使用してcpaterが提供するコードです。

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();
    }  
}

編集:Maven座標:

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

3
アサーションライブラリを交換したところです。私はhamcrestに非常に満足していましたが、junitの問題のあるインクルードの問題と、(コレクションとジェネリックを使用した)テストを書くのが難しいため、FESTが大好きです!共有いただきありがとうございます。
ギヨーム

2
FESTは現在アクティブではありません。FESTの分岐であるAssertJを使用します。 joel-costigliola.github.io/assertj
user64141

17

また、JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5が使用されている場合は、mockito-allが使用されていないことを確認してください。Hamcrestコアクラスが含まれています。代わりにmockito-coreを使用してください。以下の設定は機能します:

<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

バージョンは常に変更されているため、2014年12月2日の時点で、http://www.javacodegeeks.com/2014/03/how-to-test-dependencies-in -a-maven-project-junit-mockito-hamcrest-assertj.htmlがうまくいきました。ただし、AssertJは使用しませんでした。

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

1
hamcrest-libraryはすでにhamcrest-coreを推移的依存関係として定義しているため、hamcrest-core依存関係とhamcrest-library依存関係を同時に定義する必要はありません。
Eugene Maysyuk 2018

3

JUnitがorg.hamcrestパッケージを独自のディストリビューションに組み込んだのはなぜですか?

彼らassertThatがJUnitの一部になりたいと思っていたからだと思います。つまり、Assertクラスはorg.hamcrest.Matcherインターフェースをインポートする必要があり、JUnitがHamcrestに依存しているか、または(少なくとも部分的に)Hamcrestを含まない限り、インポートを実行できません。そして、JUnitが依存関係なしで使用できるように、その一部を含めるのは簡単だったと思います。


2

2018年に最新のライブラリを使用:

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

JUnit-4.12とJUnit-Dep-4.10の両方に、それぞれの.xmlファイルによるHamcrestの依存関係があります。

さらなる調査の結果、依存関係は.xmlファイルで作成されていましたが、ソースとクラスはjarファイルでした。これは、build.gradleの依存関係を除外する方法のようです...すべてをクリーンに保つためにテストしてください。

ただのファイ


1
私はあなたの二番目の段落を理解していません。あなたが書くつもりであったことから、あなたはいくつかの言葉を省いたのではないでしょうか?
Dan Getz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.