Ahm*_*mad 1 java junit unit-testing assert java-stream
所以我正在编写单元测试,其中我正在测试将用户列入黑名单和取消黑名单的能力(这是我代码中的一个功能,它本身工作正常)。
这是一个按预期工作的示例命令:
assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));
Run Code Online (Sandbox Code Playgroud)
如果我将用户“533”列入黑名单,然后运行上面的命令,它工作正常,因为 anExecutionException
被引发(因为您正在尝试查找被列入黑名单的用户)。类似地,如果我没有将用户“533”列入黑名单但仍然运行上述命令,则测试将失败,这也是出于类似原因的预期(即,由于您未获取列入黑名单的用户,因此现在不会抛出异常)。
但是,如果我有一个List
用户 ID userIds
(用户“533”现在是其中的一部分)并且我将它们全部列入黑名单(我知道功能正常),然后运行以下命令:
userIds.stream().map(id -> assertDoesNotThrow(() -> onlineStore.lookup(id)));
Run Code Online (Sandbox Code Playgroud)
...测试通过,即使通过它也应该失败。为什么 ?因为现在所有用户都被列入黑名单,所以在获取这些用户时,ExecutionExceptions
应该已经抛出..
如果我现在用以下任一命令替换上面的流命令,它们会按预期工作:
assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));
assertDoesNotThrow(() -> onlineStore.lookup("533"));
Run Code Online (Sandbox Code Playgroud)
所以这一切让我相信,出于某种原因,在通过 Java Streams 时,throwsExecutionExceptions
不会被捕获。
这种行为有什么解释吗?
您没有在流上调用任何终端操作,因此您的断言永远不会执行。
你在滥用map()
,它应该通过转换每个元素来创建一个新的流。你真正想要做的是执行一个对每个元素都有副作用的方法。这forEach
就是(它也是一个实际消耗流的终端操作):
userIds.stream().forEach(id -> assertDoesNotThrow(() -> onlineStore.lookup(id)));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
451 次 |
最近记录: |