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

标签 java unit-testing junit java-stream assert

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

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

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/

相关文章:

java - 如何创建自定义 "ExpectedException"junit 规则?

java - Java 中是否有相当于 PHP 中 bin2hex 和 hex2bin 的函数?

java - 强制重写类时调用基类版本方法,否则抛出异常

ios - OCMock 可以运行 block 参数吗?

c# - 如何模拟/覆盖单元测试的只读字段

gradle - 如何使用命令行在Gradle中按类别运行测试?

android - 运行用于自动化构建的JUNIT测试-如何?

java - 无法接收已发布的消息到 mqtt paho 上的订阅主题

Java 验证证书是否与 key 相关联

java - 我是 Java 自动化测试的新手。我应该更喜欢哪个工具? JUnit 还是 TestNG?