web-dev-qa-db-ja.com

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

JUnit 4.8がHamcrestマッチャーでどのように機能するかを理解できません。 _junit-4.8.jar_の _org.hamcrest.CoreMatchers_ 内にいくつかのマッチャーが定義されています。同時に、いくつかのotherマッチャーが _hamcrest-all-1.1.jar_ in _org.hamcrest.Matchers_にあります。それで、どこへ行く? hamcrest JARをプロジェクトに明示的に含め、JUnitが提供するマッチャーを無視しますか?

特に、empty() matcherに興味があり、これらのjarのいずれにも見つかりません。他に何か必要ですか? :)

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

85
yegor256

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を含めました)

47
cpater

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

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

50
Stefan Birkner

質問に正確に答えているわけではありませんが、間違いなく 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>
25

また、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>
17
souser

バージョンは常に変化しているため、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>
4
Michael Osofsky

jUnitが元のhamcrestライブラリを使用するように勧めるのではなく、org.hamcrestパッケージを独自のディストリビューションに含めたのはなぜですか?

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

3
MatrixFrog

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

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

ただのf.y.i.

0
cyclops3324911

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
gavenkoa