如何一起使用JUnit和Hamcrest?

时间:2011-04-06 15:56:58

标签: java junit hamcrest

我无法理解JUnit 4.8应该如何与Hamcrest匹配器一起使用。 org.hamcrest.CoreMatchers中的junit-4.8.jar内定义了一些匹配器。同时org.hamcrest.Matchers中的hamcrest-all-1.1.jar中有一些其他匹配器。那么,去哪里?我应该在项目中明确包含hamcrest JAR并忽略JUnit提供的匹配器吗?

特别是,我对empty()匹配器感兴趣,并且无法在任何这些罐子中找到它。我需要别的吗? :)

还有一个哲学问题:为什么JUnit将org.hamcrest包包含在自己的发行版中,而不是鼓励我们使用原始的hamcrest库?

8 个答案:

答案 0 :(得分:49)

如果你使用版本大于或等于1.2的Hamcrest,那么你应该使用junit-dep.jar。这个jar没有Hamcrest类,因此你可以避免类加载问题。

从JUnit 4.11开始,junit.jar本身没有Hamcrest类。不再需要junit-dep.jar

答案 1 :(得分:46)

junit提供了名为assertThat()的新检查断言方法,该方法使用了Matchers,并且应该提供更易读的测试代码和更好的失败消息。

要使用它,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 :(得分:24)

不完全回答你的问题,但你绝对应该尝试FEST-Assert流畅的断言API。它与Hamcrest竞争,但有一个更容易的API,只需要一个静态导入。以下是 cpater 使用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();
    }  
}

编辑:Maven坐标:

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

答案 3 :(得分: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 :(得分: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>

答案 5 :(得分:3)

  

为什么JUnit将org.hamcrest打包成自己的发行版,而不是鼓励我们使用原始的hamcrest库?

我猜这是因为他们希望assertThat成为JUnit的一部分。这意味着Assert类必须导入org.hamcrest.Matcher接口,除非JUnit依赖于Hamcrest,或者包括(至少部分)Hamcrest,否则它不能这样做。我想包括部分内容更容易,因此JUnit可以在没有任何依赖的情况下使用。

答案 6 :(得分:0)

JUnit-4.12和JUnit-Dep-4.10都根据相应的.xml文件具有Hamcrest依赖性。

进一步调查表明,虽然依赖是在.xml文件中进行的,但是jar中的源和类。这似乎是一种排除build.gradle依赖的方法...测试它以保持一切清洁。

只是一个f.y.i。

答案 7 :(得分:0)

在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")
}