2016-05-12 12 views
0

我有下面的代碼使用Java 8流將ID添加到對象列表。但是,我不斷收到錯誤'流已經被操作或關閉'。但是,由於我最近開始指向JDK 1.8,因此我只打開一個流,而另一個被調用的代碼不使用流。IllegalStateException發生在單個調用Java流之後

我也會注意到,我在測試時看到使用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方法。

+1

我不明白你的代碼如何發生,你確定發佈的代碼嗎?你能讓它更小嗎? – Tunaki

+0

請提供[MCVE]。 –

+0

更新了簡化示例 – acvcu

回答

1

您確定要/需要在您的代碼中模擬集合嗎? @Mocked註釋表示泛型類型String的所有集合都將在您從該方法執行的任何代碼中進行模擬。我不太清楚爲什麼要這樣做,但如果你這樣做,你可能需要使用Expectations塊來指定集合的​​行爲。

+0

這是正確的。通常(即,在Java 8之前),當模擬實例沒有被使用時,「@ Mocked」接口根本不起作用。然而,在Java 8中,我們有*默認方法*,'Collection'接口確實得到了一個'spliterator()'方法,其中包含接口本身的默認實現;因此這個方法被JMockit嘲笑爲* all *集合實例。這就是說,JMockit可能應該排除這些默認方法在'Collection'接口(和其他這樣的接口)中被模擬。 –

相關問題