使用Mockito为Java 8 lambda表达式编写存根

问题描述 投票:0回答:1

我有一个方法,我使用Java 8 lambda表达式。在为这个方法编写单元测试时,我需要为该表达式编写存根。我们怎么写这个?

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);
    ...
}
java unit-testing lambda mockito powermockito
1个回答
1
投票

实际上,你在单元测试中模拟了一切。 测试变得复杂并失去其价值。

methodA中,你应该模仿的唯一东西是依赖:

userRepository.findAll().

通过模拟对此方法的调用,您将通过副作用使用lambda体中的模拟数据,因为它使用findAll()的结果。

List<User> usersByMock = new ArrayList<>();
usersByMock.add(...);
usersByMock.add(...);
usersByMock.add(...);
...
when(userRepository.findAll()).thenReturn(usersByMock);
© www.soinside.com 2019 - 2024. All rights reserved.