2017-12-19 257 views
0

私はJava 8ラムダ式を使用しています。このメソッドの単体テストを書く際に、その式のスタブを書く必要があります。それをどうやって書くことができますか?Mockitoを使ってJava 8ラムダ式のスタブを書く

public List<User> methodA(String userId) { 
    List<User> users = new ArrayList<>(); 
    userRepository.findAll().forEach(users::add); 
    List<User> usersFilterByUserId = users.stream().filter(u -> u.getUserid().equalsIgnoreCase(userId)).collect(Collectors.toList()); 

    some other stuff .... 
} 

私はとしてhereを与えられた解決策を試してみました - 実際には、あなたのユニットテストのすべてを模擬

@Test 
public void testMethodA() { 
    ArrayList<User> mockUsers = mock(ArrayList.class); 
    PowerMockito.whenNew(ArrayList.class).withNoArguments().thenReturn(mockUsers); 
    User user = mock(User.class); 
    Iterable<User> mockIt = mock(Iterable.class); 
    when(userRepository.findAll()).thenReturn(mockIt); 
    doNothing().when(mockIt).forEach(any()); 

    // This gives compiler error which is obvious 
    // The method thenReturn(Stream<User>) in the type 
    // OngoingStubbing<Stream<User>> is not applicable for the arguments (ArrayList<User>) 
    ArrayList<User> mockUsersFilterByUserId = mock(ArrayList.class); 
    when(mockUsers.stream()).thenReturn(mockUsersFilterByUserId); 
    ... 
} 
+0

あなたがしようとしていることはかなり不明です。あなたはすべてのローカル変数をモックしようとしています。だから、あなたは嘲笑の目標を完全に理解していない可能性があります。しかし、 'stream()'は 'ArrayList'ではなく' Stream'を返します。それはあなたの近くの問題です。 –

答えて

1


テストが複雑になり、その値が緩やかになります。 methodA

は、あなたがモック必要があることを、単一の事が依存関係です:それが使用するよう

userRepository.findAll(). 

このメソッドに呼び出しをあざけることによって、あなたは副作用の使用によりラムダ本体内のデータを嘲笑しますfindAll()の結果です。

List<User> usersByMock = new ArrayList<>(); 
usersByMock.add(...); 
usersByMock.add(...); 
usersByMock.add(...); 
... 
when(userRepository.findAll()).thenReturn(usersByMock); 
+0

ラムダ式をスタブする必要はありませんか?実際のやりとりをしてください。 – Saurabh

+0

ラムダ式は単なる構文的な砂糖です。あなたは古典的なforループで置き換えることができます。 – davidxxx

関連する問題