如何使用 Mockito 模拟 ExecutorService 调用
How to mock ExecutorService call using Mockito
我想使用 Mockito 模拟以下代码片段。
Future<Optional<List<User>>> getUser =
executorService.submit(() -> userRepository.findById(user.getUserId()));
我试过下面的代码,但是没用
@Mock
private ExecutorService executorService;
@Mock
private userRepository userRepository;
when(executorService.submit(() -> userRepository.findById(USER_ID)))
.thenReturn(ConcurrentUtils.constantFuture(userList));
谁能给我一个解决方案?
您不想 fiddle 与 ExecutorService
本身,而是模拟 findById
以获得结果。只要模拟 returns 立即得到结果(除非你让它 Thread.sleep
一段时间), ExecutorService
中的调用本身很快,因此结果被包裹在 Future
.
Mockito.when(userRepository.findById(Mockito.any()).thenReturn(userList);
那么你根本不需要模拟 ExecutorService
,你想使用真正的服务,否则它不会做它应该做的事情。
感谢您的回答。我已经找到了针对这种情况的解决方案。
我们可以使用以下代码片段模拟执行程序服务调用。
when(executorService.submit(any(Callable.class)))
.thenReturn(ConcurrentUtils.constantFuture(userList()));
如果您的方法调用中有 多个 ExecutorService 调用,您可以通过将它们作为 comma-separated 列表添加到 Mockito 调用中来模拟每个响应如下。
when(executorService.submit(any(Callable.class)))
.thenReturn(ConcurrentUtils.constantFuture(userList()),
ConcurrentUtils.constantFuture(Optional.of(departmentList())));
我想使用 Mockito 模拟以下代码片段。
Future<Optional<List<User>>> getUser =
executorService.submit(() -> userRepository.findById(user.getUserId()));
我试过下面的代码,但是没用
@Mock
private ExecutorService executorService;
@Mock
private userRepository userRepository;
when(executorService.submit(() -> userRepository.findById(USER_ID)))
.thenReturn(ConcurrentUtils.constantFuture(userList));
谁能给我一个解决方案?
您不想 fiddle 与 ExecutorService
本身,而是模拟 findById
以获得结果。只要模拟 returns 立即得到结果(除非你让它 Thread.sleep
一段时间), ExecutorService
中的调用本身很快,因此结果被包裹在 Future
.
Mockito.when(userRepository.findById(Mockito.any()).thenReturn(userList);
那么你根本不需要模拟 ExecutorService
,你想使用真正的服务,否则它不会做它应该做的事情。
感谢您的回答。我已经找到了针对这种情况的解决方案。
我们可以使用以下代码片段模拟执行程序服务调用。
when(executorService.submit(any(Callable.class)))
.thenReturn(ConcurrentUtils.constantFuture(userList()));
如果您的方法调用中有 多个 ExecutorService 调用,您可以通过将它们作为 comma-separated 列表添加到 Mockito 调用中来模拟每个响应如下。
when(executorService.submit(any(Callable.class)))
.thenReturn(ConcurrentUtils.constantFuture(userList()),
ConcurrentUtils.constantFuture(Optional.of(departmentList())));