2016-05-12 5 views
0

オブジェクトのリストにIDを追加するためにJava 8ストリームを使用する以下のコードがあります。しかし、私はエラーが発生し続けている 'ストリームはすでに動作しているか、閉じている。しかし、私はストリームを1つしか開いていないので、最近呼び出された他のコードはJDK 1.8を指し始めてからストリームを使用しません。Javaストリームの単一コールの後でIllegalStateExceptionが発生する

また、テスト時に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(); 
} 

} 

I試験は、ストリームエラーなし通過@Mocked方法を削除した場合。

+1

コードでどのように発生する可能性がありますか?投稿されたコードについては確かですか?あなたはそれをもっと小さくすることができますか? – Tunaki

+0

[MCVE]を入力してください。 –

+0

が簡略化された例で更新されました – acvcu

答えて

1

あなたのコードにコレクションを模擬したいと思っていますか? @Mockedアノテーションは、ジェネリック型のStringのすべてのコレクションが、そのメソッドから実行するコードにすべて偽装されることを意味します。なぜあなたがそれをやりたいのかは分かりませんが、そうした場合は、おそらくExpectationsブロックを使ってコレクションの動作を指定する必要があります。

+0

これは正しいです。通常は(すなわち、Java-8以前の)、擬似インスタンスが使用されないとき、 '@ Mocked'インタフェースは全く影響を与えません。しかし、Java 8では* defaultメソッド*があり、 'Collection'インタフェースはインタフェース自体にデフォルト実装を含む' spliterator() 'メソッドを取得しました。したがって、このメソッドはJMockitによって* all *コレクションインスタンスのためにモックされます。これはおそらく、JMockitは、これらのデフォルトメソッドを 'Collection'インターフェース(および他のそのようなインターフェース)で嘲笑されないように除外すべきです。 –

関連する問題