如何模拟 executorService.submit()
How to mock executorService.submit()
如何在下面的场景中模拟 executorService.submit()。我必须嘲笑
cacheController.someMethod();但是当调用 submit 方法时,它会创建一个线程和 cacheController.someMethod();永远不会被要求进行测试 class.
@Autowired
CacheController cacheController;
protected static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(1);
EXECUTOR.submit(() -> {
try {
cacheController.someMethod();
} catch (Exception e) {
e.printStackTrace();
}
});
基本上你创建了难以测试的代码依赖于
protected static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(1);
为了对此进行测试,您必须使用 PowerMock(ito) 黑魔法来控制对此处静态方法 newFixedThreadPool(1)
的调用。理论上,这很简单,参见 here 例如。
但是:通常,当您对基于 Spring 的环境进行体面的单元测试时,您可能已经在使用另一个测试运行器,以使 @AutoWired 的东西在您的测试设置中工作。将 PowerMock(ito) 添加到其中会使事情变得更加复杂,并且容易出错。
因此,真正的答案是:重新设计您的设计,不依赖静态方法调用。如果你把那个东西变成一个 normal 字段,你应该能够使用“标准”mockito 注入机制,就像概述的 here.
最后:我还建议查看 same thread executor。意思是:不要模拟服务,而是注入一个特定的服务实例,它只是在同一个线程上调用你的代码。然后你会得到更多的测试覆盖率,但你避免了通常在单元测试中令人头疼的大多数多线程问题。
如何在下面的场景中模拟 executorService.submit()。我必须嘲笑
cacheController.someMethod();但是当调用 submit 方法时,它会创建一个线程和 cacheController.someMethod();永远不会被要求进行测试 class.
@Autowired
CacheController cacheController;
protected static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(1);
EXECUTOR.submit(() -> {
try {
cacheController.someMethod();
} catch (Exception e) {
e.printStackTrace();
}
});
基本上你创建了难以测试的代码依赖于
protected static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(1);
为了对此进行测试,您必须使用 PowerMock(ito) 黑魔法来控制对此处静态方法 newFixedThreadPool(1)
的调用。理论上,这很简单,参见 here 例如。
但是:通常,当您对基于 Spring 的环境进行体面的单元测试时,您可能已经在使用另一个测试运行器,以使 @AutoWired 的东西在您的测试设置中工作。将 PowerMock(ito) 添加到其中会使事情变得更加复杂,并且容易出错。
因此,真正的答案是:重新设计您的设计,不依赖静态方法调用。如果你把那个东西变成一个 normal 字段,你应该能够使用“标准”mockito 注入机制,就像概述的 here.
最后:我还建议查看 same thread executor。意思是:不要模拟服务,而是注入一个特定的服务实例,它只是在同一个线程上调用你的代码。然后你会得到更多的测试覆盖率,但你避免了通常在单元测试中令人头疼的大多数多线程问题。