在单元测试中模拟 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));
}
然后将其注入您的服务中心。
这将允许您在单元测试中提供模拟
我有这项服务 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));
}
然后将其注入您的服务中心。
这将允许您在单元测试中提供模拟