匹配自定义异常

Dod*_*ion 3 java assertj

Javadoc给出了该方法的示例matches

assertThat(player).matches(p -> p.isRookie());
Run Code Online (Sandbox Code Playgroud)

事实上,当我定义一个虚拟类 Player 时,上面的语句编译正常。但是,当我定义一个从 Exception 派生的类时,以下内容不会编译:

public class MyCustomException extends Exception {
    public boolean isMyCustomFieldSet() { return true; }
}
...
MyCustomException myCustomException = new MyCustomExcpetion();
assertThat(myCustomException).matches(e -> e.isMyCustomFieldSet());
Run Code Online (Sandbox Code Playgroud)

我可以通过使用强制转换来编译它:

assertThat(myCustomException).matches(e -> ((MyCustomException)e).isMyCustomFieldSet());
Run Code Online (Sandbox Code Playgroud)

但这个演员看起来“丑陋”,而且有点为了解决某种缺陷而进行了修改。我可以让它以“更好”的方式编译,即不使用强制转换吗?

Joe*_*ola 5

问题在于Assertions,它声明AbstractThrowableAssert<?, ? extends Throwable> assertThat(Throwable t)而不是<T> AbstractThrowableAssert<?, T extends Throwable> assertThat(T t)

但不幸的是,由于以下现有方法与之冲突,因此无法完成此操作:public static <T> ObjectAssert<T> assertThat(T actual)

铸造是一种解决方案,我同意它不是超级优雅。

在这种情况下我会做的很简单:

assertThat(myCustomException.isMyCustomFieldSet()).isTrue();
Run Code Online (Sandbox Code Playgroud)

或者直接保留断言myCustomException

assertThat(myCustomException).hasFieldOrPropertyWithValue("myCustomFieldSet", true)
                             .hasFieldOrPropertyWithValue("myOtherField", "foo");

Run Code Online (Sandbox Code Playgroud)

这里的缺点是通过名称访问字段,这不利于重构。