使用Mockito为Java 8 lambda表达式编写存根
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Mockito为Java 8 lambda表达式编写存根相关的知识,希望对你有一定的参考价值。
我有一个方法,我使用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);
...
}
答案
实际上,你在单元测试中模拟了一切。 测试变得复杂并失去其价值。
在methodA
中,你应该模仿的唯一东西是依赖:
userRepository.findAll().
通过模拟对此方法的调用,您将通过副作用使用lambda体中的模拟数据,因为它使用findAll()
的结果。
List<User> usersByMock = new ArrayList<>();
usersByMock.add(...);
usersByMock.add(...);
usersByMock.add(...);
...
when(userRepository.findAll()).thenReturn(usersByMock);
以上是关于使用Mockito为Java 8 lambda表达式编写存根的主要内容,如果未能解决你的问题,请参考以下文章
使用 Java 8 的 lambda 表达式,将 List<Byte> 转换为原始字节 [],无需外部库 [重复]
重学Java 8新特性 | 第3讲——我们为什么要使用Lambda表达式?
重学Java 8新特性 | 第3讲——我们为什么要使用Lambda表达式?