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
_パッケージを独自のディストリビューションに含めたのですか?
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を含めました)
1.2以上のバージョンのHamcrestを使用している場合は、junit-dep.jar
を使用する必要があります。このjarにはHamcrestクラスがないため、クラスローディングの問題を回避できます。
JUnit 4.11以降、junit.jar
自体にはHamcrestクラスがありません。 junit-dep.jar
はもう必要ありません。
質問に正確に答えているわけではありませんが、間違いなく 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>
また、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>
バージョンは常に変化しているため、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>
jUnitが元のhamcrestライブラリを使用するように勧めるのではなく、org.hamcrestパッケージを独自のディストリビューションに含めたのはなぜですか?
assertThat
をJUnitの一部にしたかったからだと思います。つまり、Assert
クラスはorg.hamcrest.Matcher
インターフェイスをインポートする必要があり、JUnitがHamcrestに依存するか、Hamcrest(の少なくとも一部)を含めない限り、インポートできません。そして、その一部を含めるほうが簡単だったと思うので、JUnitは依存関係なく使用できます。
JUnit-4.12とJUnit-Dep-4.10の両方には、それぞれの.xmlファイルに応じたHamcrest依存関係があります。
さらなる調査の結果、依存関係は.xmlファイルで作成されましたが、ソースとjarのクラスが作成されました。 build.gradleの依存関係を除外する方法のようです...すべてをきれいに保つためにそれをテストします。
ただのf.y.i.
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")
}