所以我正在编写单元测试,在其中测试将用户列入黑名单和取消黑名单的功能(这是我代码中的一个功能,它本身运行良好)。
这是一个按预期工作的示例命令:
assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));
如果我将用户“533”列入黑名单,然后运行上述命令,它工作正常,因为引发了 ExecutionException
(因为您正在尝试查找列入黑名单的用户)。同样,如果我没有将用户“533”列入黑名单但仍然运行上述命令,测试将失败,出于类似的原因这也是预期的(即现在不会抛出异常,因为您没有获取黑名单用户)。
但是,如果我有一个名为 userIds
的用户 ID List
(用户“533”现在是其中的一部分)并且我将它们全部列入黑名单(我知道的功能是工作正常),然后运行以下命令:
userIds.stream().map(id -> assertDoesNotThrow(() -> onlineStore.lookup(id)));
...测试通过,即使通过它也应该失败。为什么 ?因为现在所有用户都被列入黑名单,所以在获取这些用户时,应该抛出 ExecutionExceptions
..
如果我现在将上面的流命令替换为以下任一命令,它们将按预期工作:
assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));
assertDoesNotThrow(() -> onlineStore.lookup("533"));
所以这一切让我相信,出于某种原因,在通过 Java Streams 时,抛出的 ExecutionExceptions
不会被捕获。
对这种行为有什么解释吗?
最佳答案
您没有在流上调用任何终端操作,因此您的断言永远不会执行。
您正在滥用 map()
,它应该通过转换每个元素来创建一个新的流。你真正想要做的是执行一个对每个元素都有副作用的方法。这就是 forEach
的用途(它也是一个实际消耗流的终端操作):
userIds.stream().forEach(id -> assertDoesNotThrow(() -> onlineStore.lookup(id)));
关于java - AssertThrows 在通过 Java Streams 时不抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345781/