AssertThrows在遍历Java流时不引发异常
因此,我正在编写单元测试,其中我正在测试黑名单和非黑名单用户的能力(这是我代码中的一个功能,它本身工作正常) 下面是一个按预期工作的示例命令:AssertThrows在遍历Java流时不引发异常,java,unit-testing,junit,java-stream,assert,Java,Unit Testing,Junit,Java Stream,Assert,因此,我正在编写单元测试,其中我正在测试黑名单和非黑名单用户的能力(这是我代码中的一个功能,它本身工作正常) 下面是一个按预期工作的示例命令: assertThrows(ExecutionException.class, () -> onlineStore.lookup("533")); assertThrows(ExecutionException.class, () -> onlineStore.lookup("533")); assertDoesNotThrow(() -&
assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));
assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));
assertDoesNotThrow(() -> onlineStore.lookup("533"));
如果我将用户“533”列入黑名单,然后运行上面的命令,它可以正常工作,因为会引发ExecutionException
(因为您试图查找被列入黑名单的用户)。类似地,如果我没有将用户“533”列入黑名单,但仍然运行上述命令,测试将失败,这也是出于类似的原因(即,现在不会抛出异常,因为您没有获取黑名单用户)
但是,如果我有一个名为userIds
(该用户“533”现在是其中的一部分)的用户ID列表,并将其全部列入黑名单(我知道Funationality工作正常),然后运行以下命令:
userIds.stream().map(id -> assertDoesNotThrow(() -> onlineStore.lookup(id)));
。。。测试通过,即使它本应失败。为什么?因为现在所有用户都被列入黑名单,所以在获取这些用户时,ExecutionExceptions
应该被抛出
如果我现在将上面的streams命令替换为以下命令之一,它们将按预期工作:
assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));
assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));
assertDoesNotThrow(() -> onlineStore.lookup("533"));
因此,这一切让我相信,出于某种原因,当通过Java流时,抛出的执行异常不会被捕获
对此行为有何解释?您没有调用流上的任何终端操作,因此您的断言永远不会执行
您正在滥用map()
,它应该通过转换每个元素来创建一个新的流。实际上,您要做的是执行一个对每个元素都有副作用的方法。这就是forEach
的用途(它也是一个终端操作,实际使用流):
您没有在流上调用任何终端操作,因此您的断言永远不会执行
您正在滥用map()
,它应该通过转换每个元素来创建一个新的流。实际上,您要做的是执行一个对每个元素都有副作用的方法。这就是forEach
的用途(它也是一个终端操作,实际使用流):
谢谢,这解决了我的问题。我对streams不熟悉,所以不知道:)。。。我会在5分钟内将你的答案标记为正确。@Ahmad这是非常长的5分钟…谢谢,这解决了我的问题。我对streams不熟悉,所以不知道:)。。。我会在5分钟内将你的答案标记为正确。@Ahmad这是非常长的5分钟…