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

hamcrest core, why need this?

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

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

谢谢, Java错误

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

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

实际上,您想尽可能多地使用 "hamcrest" 的东西。

看看 assertThat,它大量使用了 hamcrest 匹配器 类。

说真的:我现在只在我的暴躁中使用 assertThat;我从不后悔这样做并完全放弃所有其他断言。

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

如果你不喜欢使用它,测试运行时hamcrest-core 的依赖应该可以,如果你想使用它,我推荐一个 test compilehamcrest-library 的依赖(使用 maven 而不是 gradle 都是范围 test)。

没有瞬态依赖可以更灵活的升级Hamcrest. Btw also Mockito has a Hamcrest dependency. Read more about Understanding Dependencies.