hamcrest核心,为什么需要这个?

时间:2016-05-25 04:24:18

标签: java junit hamcrest

我在Java中使用JUnit作为我的TDD,并注意到有两个组件可以从JUnit.org下载。首先,我认为我需要JUnit组件并下载,安装。当我编译并尝试运行我的测试时,它抱怨没有找到Hamcrest类。所以我不得不从他们的主页再次下载这个。

所以,出于好奇,为什么我们需要从一开始就为一个目的使用两次下载?有谁知道为什么hamcrest核心与JUnit是分开的,即使它被JUnit使用了?

谢谢, Javabug

3 个答案:

答案 0 :(得分:6)

JUnit使用Hamcrest。在过去,JUnit嵌入了导致问题的Hamcrest类,因为项目在不同的周期中不断发展。在最近的JUnit版本中(如果我没有错,从4.11开始)这已经改变了,并且没有嵌入Hamcrest。因此,如果将JUnit作为依赖项添加到项目中(Maven,Gradle等),您将隐式获得对Hamcrest的依赖。

我相信Hamcrest上的这个问题在某种程度上与分裂有关。 https://github.com/hamcrest/JavaHamcrest/issues/92

答案 1 :(得分:2)

org.junit.Assert依赖于Hamcrest核心库。因为它是静态方法签名assertThat()的一部分,所以它必须位于类路径上。

如果您不想使用它,hamcrest-core上的测试运行时依赖项应该有效,如果您想使用它,我建议测试编译依赖于hamcrest-library(使用maven而不是gradle,它的所有范围 test )。

升级Hamcrest不会有更灵活的短暂依赖。顺便说一句,Mockito也有Hamcrest依赖。详细了解Understanding Dependencies

答案 2 :(得分:1)

实际上,你想尽可能多地使用“hamcrest”。

看看assertThat,它大量使用了hamcrest matcher类。

说真的:我现在只在我的暴躁中使用断言;我从来没有后悔这样做,完全抛弃所有其他断言。