Mockito, JUnit, Hamcrest, Versioning



默认情况下,Hamcrest 的所需版本:

  • JUnit 4.11
    • 哈姆克雷斯特 1.3
  • 模拟核心 1.9.5
    • 哈姆克雷斯特 1.1

Hamcrest 1.1 和 1.3 之间没有明显的 API 更改。目前,我的测试用例尝试使用 Hamcrest 4.11 运行 JUnit 1.1,但我有理由确定这是一个坏主意。出于类似的原因,我怀疑尝试将 Mockito-core 1.9.5 与 Hamcrest 1.3 一起使用也是一个坏主意。

怎么办?

  1. 将Hamcrest 1.1与最新的JUnit和Mockito一起使用
  2. 将Hamcrest 1.3与最新的JUnit和Mockito一起使用
  3. 尝试修补 Mockito-core 1.9.5 以使用 Hamcrest 1.3
    • 我目前没有时间
  4. 使用 JUnit 4.10
  5. 其他?

更新 2015-06-12:Mockito 1.10.19 和 2.0.13-beta 仍然使用 Hamcrest 1.1

2015 年 7 月 29 日由 @durron597 更新:这个出色的答案在 2013 年是正确的,但是它已被 Mockito 的更新所淘汰。看到这个答案。

我在许多Maven项目中使用最新的JUnit和Mockito核心依赖项和hamcrest 1.3。到目前为止,没有人报告任何问题。因此,如果这适用于您的测试,请使用所有三个的最新版本。只需确保使用模拟核心而不是全部。

因此,我建议使用选项 2 以获得较新版本的所有好处。如果您真的怀疑任何事情都可能出错,请使用选项 4,这是最安全的。但是,当然,您可以使用选项2,并且在不久的将来出现任何问题时,您可以切换到选项2。或者从那时起,一个新的 mockito 已经在那里解决这个问题。

来自 mockito 第 397 期的说明:此问题不会出现在 mockito-core 中。

更新:截至2015年6月30日,最新版本的Mockito在内部使用Hamcrest 1.3。

  • Github提交
  • 马文中央链接

因此,对于那些能够升级到Mockito 2.0的人来说,这个问题已经过时了。

我不会改变公认的答案,因为 mszalbach 应该保留 15 次代表,但这应该是新的规范答案

这是 mszalbach 建议的 Maven 解决方案:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-all</artifactId>
      <version>1.3</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <exclusions>
        <exclusion>
          <artifactId>hamcrest-core</artifactId>
          <groupId>org.hamcrest</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
      <version>1.9.5</version>
      <exclusions>
        <exclusion>
          <groupId>org.hamcrest</groupId>
          <artifactId>hamcrest-core</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

查看这里的 Mockito 文档,我认为选项 2 是推荐的方法(使用 mockito-core 工件)。

最新更新