AssertThrows在通过Java Streams时不会抛出异常

问题描述 投票:1回答:1

所以我正在编写单元测试,我正在测试黑名单和黑名单用户的能力(这是我的代码本身工作正常的功能)。

这是一个按预期工作的示例命令:

assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));

如果我将用户“533”黑名单,然后运行上面的命令,它工作正常,因为引发了ExecutionException(因为你试图查找被列入黑名单的用户)。类似地,如果我没有列入黑名单用户“533”但仍然运行上述命令,则测试将失败,这也是出于类似原因的预期(即,由于您没有获取列入黑名单的用户,因此现在不会抛出异常)。

但是,如果我有一个名为ListuserIds用户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不会被抓住。

对此行为有何解释?

java unit-testing junit java-stream assert
1个回答
4
投票

您没有在流上调用任何终端操作,因此您的断言永远不会被执行。

你在滥用map(),它应该通过转换每个元素来创建一个新的流。你真正想要做的是执行一个对每个元素都有副作用的方法。这就是forEach的用途(它也是一个实际消耗流的终端操作):

 userIds.stream().forEach(id -> assertDoesNotThrow(() -> onlineStore.lookup(id)));
© www.soinside.com 2019 - 2024. All rights reserved.