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)
但这个演员看起来“丑陋”,而且有点为了解决某种缺陷而进行了修改。我可以让它以“更好”的方式编译,即不使用强制转换吗?
问题在于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)
这里的缺点是通过名称访问字段,这不利于重构。
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |