21

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

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

Hamcrest 1.1 和 1.3 之间没有任何 API 变化。目前我的测试用例尝试使用 Hamcrest 1.1 运行 JUnit 4.11,但我有理由确定这是一个坏主意。出于类似的原因,我怀疑尝试将 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

4

4 回答 4

13

@durron597 于 2015 年 7 月 29 日更新:这个出色的答案在 2013 年是正确的,但后来由于 Mockito 的更新而变得过时。看到这个答案。

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

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

来自mockito 问题 397的注释:这个问题不会出现在 mockito-core 中。

于 2013-09-12T17:53:26.693 回答
4

这是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>
于 2014-06-30T12:07:23.020 回答
4

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

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

我不会更改已接受的答案,因为 mszalbach 应该保留 15 个代表,但这应该是新的规范答案

于 2015-07-29T14:04:31.630 回答
3

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

于 2013-09-12T17:50:17.970 回答