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