Avi*_*che 5 testing junit unit-testing mockito powermock
如何在下面的场景中模拟 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();
}
});
Run Code Online (Sandbox Code Playgroud)
基本上,您通过依赖创建了难以测试的代码
protected static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(1);
Run Code Online (Sandbox Code Playgroud)
为了测试这一点,您必须使用 PowerMock(ito) 黑魔法来控制对此处静态方法的调用newFixedThreadPool(1)
。从理论上讲,这很好而且很简单,请参见此处的示例。
但是:通常,当您对基于 Spring 的环境进行适当的单元测试时,您可能已经在使用另一个测试运行程序,以使 @AutoWired 东西在您的测试设置中工作。添加 PowerMock(ito) 会使事情变得更加复杂,并且容易出错。
因此,真正的答案是:重新设计您的设计,不要依赖静态方法调用。如果你把那个东西变成一个普通的字段,你应该能够使用“标准”mockito注入机制,就像这里概述的那样。
最后:我还建议研究同一个线程执行器。含义:不要模拟服务,而是注入一个特定的服务实例,该实例仅在同一线程上调用您的代码。然后,您将获得更多的测试覆盖率,但可以避免通常在单元测试中令人头疼的大多数多线程问题。