在我尝试的每个JUnit版本中(最多4.8.1),一个失败的断言,它将显示一条如下所示的错误消息:
预期:[describeTo]
got:[对象的字符串表示]
换句话说,它将显示对象的toString(),而不是Matcher中的不匹配描述。如果我使用org.hamcrest.MatcherAssert.assertThat中的assertThat,那么它将调用'describeMismatch'并显示更有用的错误消息。
我是否错误地使用了Junit,或者目前没有JUnit版本能够满足我的需求?那么大多数人都会使用Hamcrest声明吗?
答案 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>)
并在第一个参数中编写您自己的消息,以便更好地描述故障。