是否有一个使用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
并在第一个参数中编写您自己的消息,以便更好地描述故障。