Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AssertThrows在遍历Java流时不引发异常_Java_Unit Testing_Junit_Java Stream_Assert - Fatal编程技术网

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分钟…