gpt4 book ai didi

java - 使用 Mockito 为 Java 8 lambda 表达式编写 stub

转载 作者:行者123 更新时间:2023-12-02 11:50:40 24 4
gpt4 key购买 nike

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

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

最佳答案

实际上,您在单元测试中模拟了所有内容。
测试变得复杂并失去了值(value)。

methodA 中,您应该模拟的唯一一件事是依赖项:

userRepository.findAll().

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

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

关于java - 使用 Mockito 为 Java 8 lambda 表达式编写 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47893050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com