dlh*_*all 5 java java-8 assertj java-stream
在大多数情况下,并行流中引发的异常不会具有其所有属性。
例如:
@Test
public void test() {
assertThatThrownBy(() -> Stream.of("1", "2", "asdf").parallel().forEach(Integer::parseInt))
.asInstanceOf(InstanceOfAssertFactories.type(NumberFormatException.class))
.extracting("detailMessage")
.isEqualTo("For input string: \"asdf\"");
}
Run Code Online (Sandbox Code Playgroud)
大多数情况下这会失败,而这是:
@Test
public void test() {
assertThatThrownBy(() -> Stream.of("1", "2", "asdf").forEach(Integer::parseInt))
.asInstanceOf(InstanceOfAssertFactories.type(NumberFormatException.class))
.extracting("detailMessage")
.isEqualTo("For input string: \"asdf\"");
}
Run Code Online (Sandbox Code Playgroud)
成功100%的时间。
另一件事是,当消息不存在时,它将出现在异常原因中。例如:
@Test
public void test() {
assertThatThrownBy(() -> Stream.of("1", "2", "asdf").parallel().forEach(Integer::parseInt))
.asInstanceOf(InstanceOfAssertFactories.type(NumberFormatException.class))
.extracting("cause.detailMessage")
.isEqualTo("For input string: \"asdf\"");
}
Run Code Online (Sandbox Code Playgroud)
关于如何使并行流抛出精确和异常而不是某种嵌套怪物的任何想法?
也许您正在接收一个由另一种类型的异常包装的异常,该异常parallel()会抛出更多信息,而您要查找的实际异常位于getCause()或中getSupperessed()。
外部异常具有的附加信息可以是流中通过异常的项目数量(例如“3 中的 1”)或类似的信息。