可以定制"but:was"子句的输出吗?

Sle*_*led 6 hamcrest

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

assertThat( writeRequest, hasRole("admin") );
Run Code Online (Sandbox Code Playgroud)

当这失败时,我希望看到如下消息:

Expected: "admin"
     but: was "read-only"
Run Code Online (Sandbox Code Playgroud)

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

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

Sle*_*led 5

TL;博士:覆盖org.hamcrest.BaseMatcher.describeMismatch(Object item, Description description)


在使用运行测试时,org.hamcrest.collection.IsIterableWithSize我发现测试失败并显示以下消息:

Expected: an iterable with size <1>
     but: iterable size was <0>
Run Code Online (Sandbox Code Playgroud)

其中有一个定制的but条款!

查看源代码,IterableWithSize我注意到字符串作为参数"iterable size"传入。通过我发现该方法的地方追溯了这一点。由于具有该方法的实现,如果您让 IDE 生成缺少方法的存根,您将错过它。org.hamcrest.FeatureTypeMatcherfeatureNameorg.hamcrest.TypeSafeDiagnosingMatcherdescribeMismatch(Object,Description)BaseMatcher