可以输出"但是:"条款是否定制?

时间:2014-08-09 18:51:03

标签: hamcrest

我正在尝试编写一个自定义匹配器,在对象图中深入导航以检查重要属性。

assertThat( writeRequest, hasRole("admin") );

如果失败,我希望看到如下消息:

Expected: "admin"
     but: was "read-only"

然而,当断言失败时,它打印出toString()上的writeRequest,这意味着我想要的信息将在字符串的深处。更糟糕的是,沿着对象图是一个生成的类,它不是@Override Object.toString(),因此您甚至无法找到(没有记录或断点)用户的实际角色!

那么,在Hamcrest中,有没有办法自定义but: was子句中出现的输出?

1 个答案:

答案 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生成缺少方法的存根,那么您将错过它。