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