我正在尝试编写一个自定义匹配器,在对象图中深入导航以检查重要属性。
assertThat( writeRequest, hasRole("admin") );
如果失败,我希望看到如下消息:
Expected: "admin"
but: was "read-only"
然而,当断言失败时,它打印出toString()
上的writeRequest
,这意味着我想要的信息将在字符串的深处。更糟糕的是,沿着对象图是一个生成的类,它不是@Override
Object.toString()
,因此您甚至无法找到(没有记录或断点)用户的实际角色!
那么,在Hamcrest中,有没有办法自定义but: was
子句中出现的输出?
答案 0 :(得分:4)
tl; dr:覆盖org.hamcrest.BaseMatcher.describeMismatch(Object item, Description description)
使用org.hamcrest.collection.IsIterableWithSize
运行测试时,我发现测试失败并显示以下消息:
Expected: an iterable with size <1>
but: iterable size was <0>
有一个自定义的but
条款!
展望source code for IterableWithSize
我注意到字符串"iterable size"
作为参数featureName
传递到org.hamcrest.FeatureTypeMatcher
。通过org.hamcrest.TypeSafeDiagnosingMatcher
跟踪了这一点,我发现了describeMismatch(Object,Description)
方法。由于BaseMatcher
具有该方法的实现,如果您让IDE生成缺少方法的存根,那么您将错过它。