单次调用Java流后发生IllegalStateException

时间:2016-05-12 14:26:53

标签: java junit lambda java-stream jmockit

我在下面使用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错误。

1 个答案:

答案 0 :(得分:1)

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