2017-12-19 3 views
0

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); 
    ... 
} 
+0

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. –

Antwort

1

Eigentlich Sie alles in Ihrer Unit-Test verspotten.
Der Test wird komplex und verliert seinen Wert.

In methodA, die einzige Sache, dass Sie verspotten sollte die Abhängigkeit ist:

userRepository.findAll(). 

Durch spöttisch den Aufruf dieser Methode werden Sie von Nebeneffekt Nutzungsdaten in den Lambda-Körper verspottet, da es die verwendet Ergebnis von findAll().

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

Meinen Sie, dass Sie Lambda-Ausdruck nicht stubben müssen? Haben Sie die tatsächliche Interaktion an Ort und Stelle. – Saurabh

+0

Sicher. Lambda-Expression ist nur syntaktischer Zucker. Sie könnten es durch eine klassische for-Schleife ersetzen. – davidxxx

Verwandte Themen