Ich habe eine Methode, wo ich Java 8 Lambda-Ausdruck verwende. Während des Komponententests für diese Methode muss ich einen Stub für diesen Ausdruck schreiben. Wie können wir das schreiben?Verwenden Sie Mockito, um Stub für Java 8 Lambda-Ausdrücke zu schreiben
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 ....
}
Ich versuchte Lösung gegeben here as -
@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);
...
}
Es ist ziemlich unklar, was Sie versuchen zu tun - Sie versuchen, alle lokalen Variablen zu verspotten, so ist es möglich, dass Sie das Ziel der Verspottung nicht vollständig verstehen. Aber 'stream()' gibt einen 'Stream' zurück, nicht eine' ArrayList', also ist das Ihr nahestes Problem. –