是否有一个版本的JUnit断言使用Hamcrest的'describeMismatch'功能?

时间:2010-10-12 14:15:55

标签: java unit-testing junit hamcrest

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

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

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

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

3 个答案:

答案 0 :(得分:3)

简答:不。

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

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

答案 1 :(得分:1)

是的,这由this commit中的JUnit 4.11修复:

  

正如Hamcrest的Steve Freeman所指出的,Matcher接口现在已经出现了   还有一个方法describeMismatch。要抓住这样的安全   未来的改进,使用MatcherAssert而不是   重复其实施。

upgrade to Hamcrest 1.3(也在4.11中)一起,这两个版本可以很好地协同工作。

答案 2 :(得分:0)

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