默认情况下,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 一起使用也是一个坏主意。
怎么办?
- 将Hamcrest 1.1与最新的JUnit和Mockito一起使用
- 将Hamcrest 1.3与最新的JUnit和Mockito一起使用
- 尝试修补 Mockito-core 1.9.5 以使用 Hamcrest 1.3
- 我目前没有时间
- 使用 JUnit 4.10
- 其他?
更新 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 工件)。