gpt4 book ai didi

java - 如何为 Java Stream 编写 Junit

转载 作者:行者123 更新时间:2023-12-01 11:04:46 26 4
gpt4 key购买 nike

我最近开始使用 java 流并编写一个用户服务,它返回一个用户流。
使用该用户流,我处理其他逻辑。

以下是我正在处理流的一段代码,它工作正常

try (Stream<User> users = userService.getStream()) {
users.forEach(user -> {
});

但是当我开始编写 Junit 时,它会失败并显示以下错误消息。
java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
at com.test.UserService.sendBulkNotification(UserService.java:47)
at com.test.UserServiceTest.sendNotificationTest(UserServiceTest.java:64)

这是我的单元测试代码:
List<User> users = new ArrayList<>();
for(long i = 1; i <= 5; i++) {
User user = new User();
user.setId(i);
users.add(user);
}

when(userService.getStream()).thenReturn(users.stream());
userService.sendNotification("user", 1, "test.com");

你能帮我用流写测试用例/帮我解决这个问题吗?

最佳答案

当您使用 thenReturn(users.stream()) ,您调用users.stream()一次就交给Stream对象转移到 Mockito 运行时,然后每次 when(...) 时都会返回相同的实例被触发。

由于 Stream只能消耗一次,任何二次触发都会失败。

你需要给 Mockito 一个工厂/供应商对象,它可以产生一个新的 Stream每次触发触发。 Mockito 称之为 Answer ,所以请调用 thenAnswer(Answer<?> answer) 反而。

when(userService.getStream()).thenAnswer(invo -> users.stream());

您必须在 lambda 表达式中命名参数,但由于您不使用它,因此您可以将其命名为任何名称。我用了 invo简称 invocation ,为 answer 声明的参数的名称 Answer 中的方法功能界面。

关于java - 如何为 Java Stream 编写 Junit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60161649/

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