在单元测试中模拟 Executorservice 字段

mocking Executorservice field in unit test

我有这项服务 class,我正在尝试使用 mockito 进行单元测试但失败了:

@Service("processor")
public class AsyncProcessor extends Processor {

    @Value("${queue.size}")
    private int queueSize;

    @Value("${executor.corePoolSize}")
    private int corePoolSze;

    @Value("${executor.maxPoolSize}")
    private int maxPoolSize;

    @Value("${executor.keepAliveTime}")
    private int keepAliveTime;

    private final JobRunner jobRunner;

    private final ExecutorService executorService;

    public AsyncProcessor(final MyRepo repo,
                              final JobRunner jobRunner) {
        super(repo);
        this.jobRunner = jobRunner;
        executorService = new ThreadPoolExecutor(corePoolSze, maxPoolSize, keepAliveTime, TimeUnit.SECONDS,
                                                 new LinkedBlockingQueue<>(queueSize));
    }
    ///

}

所以我写了这个测试class:

@ExtendWith(MockitoExtension.class)
public class AsyncProcessorTest{

    @Mock
    private MyRepo repo;

    @Mock
    private JobRunner jobRunner;


    @InjectMocks
    private AsyncProcessor asyncProcessor;


    @Test
    public void someTest() {
    }

}

当我 运行 我的测试时,我在注入模拟时出错。

尝试在构造函数上实例化executorService时出现错误。

我的问题是如何模拟和使用它并克服这个错误?

我会以不同的方式初始化服务 - 而不是在此 class 中拥有属性并在 c'tor 中创建 executorService - 使其成为一个单独的 bean 并注入它。

在您的应用程序上下文中:

@Value("${queue.size}")
private int queueSize;

@Value("${executor.corePoolSize}")
private int corePoolSze;

@Value("${executor.maxPoolSize}")
private int maxPoolSize;

@Value("${executor.keepAliveTime}")
private int keepAliveTime;

@Bean
ExecutorService executorService() {
  return new ThreadPoolExecutor(corePoolSze, maxPoolSize, keepAliveTime, 
        TimeUnit.SECONDS,new LinkedBlockingQueue<>(queueSize));
}

然后将其注入您的服务中心。
这将允许您在单元测试中提供模拟