如何使用Mockito模拟ExecutorService调用

ogq8wdun  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(175)

我想使用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));


谁能给我一个给予解决方案?

jexiocij

jexiocij1#

谢谢你的回答。我已经找到了解决这个问题的方法。
我们可以使用下面的代码片段来模拟执行器服务调用。

when(executorService.submit(any(Callable.class)))
      .thenReturn(ConcurrentUtils.constantFuture(userList()));

字符串
如果在方法调用中有多个ExecutorService调用,则可以通过将它们作为逗号分隔的列表添加到Mockito调用来模拟每个响应,如下所示。

when(executorService.submit(any(Callable.class)))
      .thenReturn(ConcurrentUtils.constantFuture(userList()),
           ConcurrentUtils.constantFuture(Optional.of(departmentList())));

5lwkijsr

5lwkijsr2#

只要mock立即返回结果(除非你让它暂时返回Thread.sleep),ExecutorService中的调用本身就很快,因此结果被 Package 在Future中。

Mockito.when(userRepository.findById(Mockito.any()).thenReturn(userList);

字符串
那么你根本不需要模仿ExecutorService,你想使用一个真实的服务,否则它就不会做它应该做的事情。

icnyk63a

icnyk63a3#

接受的答案对我不起作用,因为编译器一直告诉我将any(Callable.class)转换为Runnable。所以,我用(类似于实现)来嘲笑它:

when(executorService.submit(() -> any(Callable.class)))
      .thenReturn(ConcurrentUtils.constantFuture(userList()));

字符串

相关问题