【问题标题】:How to mock ExecutorService call using Mockito如何使用 Mockito 模拟 ExecutorService 调用
【发布时间】:2020-10-21 14:45:04
【问题描述】:

我想使用 Mockito 模拟以下代码 sn-p。

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

谁能给我一个解决方案?

【问题讨论】:

    标签: java multithreading unit-testing mockito executorservice


    【解决方案1】:

    您不想摆弄ExecutorService 本身,而是模拟findById 以获得结果。只要模拟立即返回结果(除非你让它Thread.sleep 一段时间)ExecutorService 中的调用本身很快,因此结果被包裹在Future 中。

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

    那么你根本不需要模拟ExecutorService,你想使用一个真正的服务,否则它不会做它应该做的事情。

    【讨论】:

    • 我试过这个,但它给了我空值作为返回值。不是用户列表 :(
    • 不要模拟ExecuteService(删除@Mock),否则它不会做它应该做的事情。 (见我的编辑)
    • 谢谢。当我从ExecuteService 中删除@Mock 时,调用executorService.submit 部分时出现NullPointerException
    【解决方案2】:

    感谢您的回答。我已经为这种情况找到了解决方案。

    我们可以使用以下代码 sn-p 模拟执行器服务调用。

    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())));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多