2016-05-19 10 views
1

私はmockitoを使っていますが、どうすればstream.map()を呼び出せますか?mocking java8 stream.map

nullを返すようなものを試しました。

@Mock Stream<String> stringStream; 
@Mock Stream<String> upperCaseStream; 

when(stringStream.map(String::toUpperCase)).thenReturn(upperCaseStream); 
syso(stringStream.map(String::toUpperCase)); 

これはnullを出力します。

出力で 'upperCaseStream'を返す正しい方法を探しています。

+0

実際に 'upperCaseStream'を初期化しましたか? – Turing85

+0

私は問題ではないモックを初期化しました。初期化しないと、stringStream.map(String :: toUpperCase)はNPEを投げます。 – Manipal

+0

これは、シンプルで重視されたライブラリ関数です。なぜあなたはそれらを嘲笑しようとしていますか? –

答えて

3

メソッド参照やlambdaの識別情報は、呼び出しが同じに見えても同じであるとは限りません。 Check this out

私はMockitoについてあまり知らないが、私はそれがwhenが登録されている値が存在する場合、これはここで動作するようにguranteedされていないどこかに等しいの呼び出しをinvloveかもしれないチェックと信じています。例えば:あなたは、単に変数に参照を格納し、ところで

Function<String, String> toUpperCase = String::toUpperCase; 
when(stringStream.map(toUpperCase)).thenReturn(upperCaseStream); 

System.out.println(stringStream.map(toUpperCase)); 

に、後でそれを使用することができ

Function<String, String> fn1 = String::toUpperCase; 
Function<String, String> fn2 = String::toUpperCase; 
System.out.println(fn1.equals(fn2)); // false on my machine 

今までどこに単にできStream<String>を模擬する必要があるだろう、なぜ、私は本当に理解していませんdo Stream.of("foo","bar")

+2

"メソッド参照またはlambdaの同一性は、呼び出しが同じに見えても同じであることが保証されていません"。これはなぜ私のアプローチが失敗しているのかを説明します。ありがとう。 – Manipal