如何模拟executorService.submit()



我如何在下面的场景中模拟executorService.submit()。我必须模仿

cacheController.someMethod();但当调用submit方法时,它会创建一个线程和cacheController.someMethod();从未被要求参加测试班。

@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)的调用。从理论上讲,这是很好的,也很容易,比如这里。

但是:通常,当您为基于Spring的环境进行适当的单元测试时,您可能已经在使用另一个测试运行程序,以使@AutoWired在您的测试设置中发挥作用。添加PowerMock(ito)会使事情变得更加复杂,并且容易出错。

因此,真正的答案是:重新设计,使依赖静态方法调用。如果你把这个东西变成正常字段,你应该能够使用";标准";mockito注射机制,如这里概述的。

最后:我还建议研究一个相同的线程执行器。意思是:不要模拟服务,而是注入一个特定的服务实例,它只是在同一个线程上调用您的代码。然后,您可以获得更多的测试覆盖率,但可以避免在单元测试中通常会令人头疼的大多数多线程问题。

相关内容

  • 没有找到相关文章

最新更新