Mockito在when方法中捕获间谍对象的值



我想根据传递给间谍对象ExecutorService的值来做一些事情。我只想.doCallRealMethod((或抛出异常来测试我的逻辑是否正确。我不知道如何用莫基托做这件事。我有我的逻辑示例代码:

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

这不是完整的代码,但问题是,"when"中的这个表达式就像被调用一样——我在调试器上看到有一个对AbstractExecutitorService::submit(Callable(的调用,我从submit方法中得到了NullPointerException,因为要检查传递的参数是否为null。

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

好吧,我想明白了。

必须是:

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

请注意,.submit((并没有直接出现在when((子句中。当它是这样的时候,它真的会调用ExecutorService和它的超级AbstractExecutorServices,其中会抛出NullPointerException。

最新更新