我在Java中使用JUnit作为我的TDD,并注意到有两个组件可以从JUnit.org下载。首先,我认为我需要JUnit组件并下载,安装。当我编译并尝试运行我的测试时,它抱怨没有找到Hamcrest类。所以我不得不从他们的主页再次下载这个。
所以,出于好奇,为什么我们需要从一开始就为一个目的使用两次下载?有谁知道为什么hamcrest核心与JUnit是分开的,即使它被JUnit使用了?
谢谢, Javabug
答案 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类。
说真的:我现在只在我的暴躁中使用断言;我从来没有后悔这样做,完全抛弃所有其他断言。