gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:23:38 24 4
gpt4 key购买 nike

所以我正在编写单元测试,在其中测试将用户列入黑名单和取消黑名单的功能(这是我代码中的一个功能,它本身运行良好)。

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com