是否有一个使用Hamcrest’describeMismatch’function的JUnit断言版本?

在我尝试过的每个JUnit版本中(最多4.8.1),一个失败的assertThat会显示一条错误消息,如下所示:

预期的:[describeTo]
得到:[对象的字符串表示]

换句话说,它将显示对象的toString()而不是Matcher的不匹配描述。 如果我使用org.hamcrest.MatcherAssert.assertThat中的assertThat,那么它将调用’describeMismatch’并显示更有用的错误消息。

我是否错误地使用了Junit,或者目前没有JUnit版本能够满足我的需求吗? 那么大多数人都会使用Hamcrest声明吗?

简答:不。

据我所知,最新版本的Hamcrest(1.2)引入了类型签名,它与版本1.1不兼容,JUnit目前依赖它。 我不确定Hamcrest的变化造成的损害程度(可以这么说),但JUnit团队似乎并不急于升级(参见公开问题 )。

我不完全确定我已经解决了我的问题,但我打算使用MatcherAssert.assertThat() 。 这可能需要特定版本的JUnit(我相信junit-dep-xxx),它不会与Hamcrest发生类路径冲突。 否则,当assertThat()调用describeMismatch()时,您可能会收到NoSuchMethodErrors

是的,这是由JUnit 4.11中的 此提交修复的:

正如Hamcrest的Steve Freeman所指出的,Matcher接口现在还有一个方法describeMismatch。 为了安全地在将来捕获这些改进,使用MatcherAssert而不是复制其实现。

随着Hamcrest 1.3 (也在4.11)的升级 ,这两个版本可以很好地协同工作。

使用其他版本 assertThat(String, T, Matcher)并在第一个参数中编写您自己的消息,以便更好地描述故障。