Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何模拟executorService.submit()_Unit Testing_Testing_Junit_Mockito_Powermock - Fatal编程技术网

Unit testing 如何模拟executorService.submit()

Unit testing 如何模拟executorService.submit(),unit-testing,testing,junit,mockito,powermock,Unit Testing,Testing,Junit,Mockito,Powermock,如何在下面的场景中模拟executorService.submit()。我不得不嘲笑 cacheController.someMethod();但在调用submit方法时,它会创建一个线程和cacheController.someMethod();从未为测试类调用过 @Autowired CacheController cacheController; protected static final ExecutorService EXECUTOR = Executors.newFixedThre

如何在下面的场景中模拟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注入机制,如图所示

最后:我还建议您调查一个问题。意思是:不要模拟服务,而是注入一个特定的服务实例,该实例只是在同一线程上调用您的代码。这样,您就可以获得更多的测试覆盖率,但您可以避免通常会给单元测试带来麻烦的大多数多线程问题