我下面的代码使用Java 8流将ID添加到对象列表。但是,我不断收到错误消息“流已被操作或关闭”。但是,我只打开一个流,而自从我最近开始指向JDK 1.8以来,另一个被调用的代码不使用流。

我还将注意到,在测试时使用JUnit会看到错误,因此不确定是否可能是问题所在。

有任何想法吗?

编辑:删除了原始代码并添加了简化示例。看来问题与使用@Mocked方法参数有关。

public class FooService {

public Collection<Course> getCourses() {
    List<Course> result = Arrays.asList(new Course(), new Course(), new Course());
    result.stream().forEach(c -> c.setUrl("foobar"));

    return result;
}

}


课程

public class Course {

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

private String url;

}


测试码

@RunWith(JMockit.class)
public class FooServiceTest {

@Tested
FooService foobarService;

@Test
public void testOne(@Mocked Collection<String> bar) {
    foobarService.getCourses();
}

@Test
public void testTwo(@Mocked Collection<String> bar) {
    foobarService.getCourses();
}

}


如果删除了@Mocked方法,则测试将通过而不会出现Stream错误。

最佳答案

您确定要/需要在代码中模拟Collections吗? @Mocked批注意味着将在您从该方法执行的任何代码中模拟所有通用类型为String的Collections。我不太确定为什么要这么做,但是如果这样做,您可能需要使用Expectations块为Collections指定行为。

10-06 09:15