【问题标题】:Mockito capture value on spy object in when methodMockito 在 when 方法中捕获间谍对象的值
【发布时间】:2020-03-04 12:41:11
【问题描述】:

我想根据传递给 spy 对象 ExecutorService 的值做一些事情。我只想 .doCallRealMethod() 或抛出异常并测试我的逻辑是否正确。我无法弄清楚如何用 mockito 做到这一点。我有我的逻辑示例代码:

public class TasksRunner {

    @Autowired
    private ExecutorService executorService;

    public void runTasks(List<Task> tasks) {

        for(Task task : task) {
            Worker = new Worker(task);
            try {
                executorService.submit(worker);
            } catch(RejectedExecutionException e) {
                // logic
            }
        }

        // logic
    }
}

以及测试代码:

var executorService = spy(Executors.newFixedThreadPool(THREAD_POOL_SIZE));

when(executorService.submit(argThat(new ArgumentMatcher<Worker>() {
    @Override
    public boolean matches(Worker w) {
        // logic 
        return w.isSomething();
    }
}))).thenThrow(new RejectedExecutionException());

// logic

这不是完整的代码,但问题是,“何时”中的这个表达式就像被调用一样 - 我在调试器上看到有一个对 AbstractExecutorService::submit(Callable) 的调用,我从提交中得到 NullPointerException方法,因为有一个检查传递的参数是否为空。

也许这不是使用 mockito 的合适方法。我的问题是如何编写这样一个测试来检查哪个工人被传递给 ExecutorService 并调用真实方法或抛出异常。

【问题讨论】:

    标签: java mockito


    【解决方案1】:

    好的,我想通了。

    必须是:

    doThrow(new RejectedExecutionException()).when(executorService).submit(Matchers.<Worker>argThat(w -> w.isSomething()));
    

    注意 .submit() 不是直接在 when() 子句中。当它是时,它真正调用 ExecutorService 及其超级 AbstractExecutorService 抛出 NullPointerExceptions。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多