通过Java Streams时AssertThrows不引发异常

时间:2019-03-25 20:18:11

标签: java unit-testing junit java-stream assert

因此,我正在编写单元测试,其中要测试将用户列入黑名单和不列入黑名单的功能(这是我的代码中的一项功能,可以正常工作)。

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

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被捕获。

对此行为有任何解释吗?

1 个答案:

答案 0 :(得分:4)

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

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

 userIds.stream().forEach(id -> assertDoesNotThrow(() -> onlineStore.lookup(id)));