spring之模拟 Autowired ExecutorService
mfrbuaa
阅读:163
2025-06-02 22:19:02
评论:0
摘要:
我有一个 Spring @Component使用 Autowiring 的 ExecutorService 作为工作池。我正在使用 JUnit 和 Mockito 来测试组件的功能,我需要模拟那个 Executor Service。这对于其他 Autowiring 的成员来说是微不足道的——一个通用的帮助器,例如一个 DAO 层很容易模拟,但我需要一个真正的执行器服务。
代码:
@RunWith(MockitoJUnitRunner.class)
public class MadeUpClassNameTest{
@Mock
private ExecutorService executor;
@Before
public void initExecutor() throws Exception{
executor = Executors.newFixedThreadPool(2);
}
@InjectMocks
private ASDF componentBeingAutowired;
...
仅此不起作用,
invokeAll() 的结果始终是一个空列表。
尝试更明确地模拟 executor 方法也不起作用......
@Test
public void myTestMethod(){
when(executor.invokeAll(anyCollection()))
.thenCallRealMethod();
...
}
我得到了措辞含糊的异常:
You cannot use argument matchers outside of verification or stubbing.
(我以为这是一个 stub ?)
我可以提供
thenReturn(Answer<>)方法,但我想确保代码实际上与执行程序一起工作,相当多的代码专门用于映射 Futures 的结果。
问题
如何提供真实(或功能可用的模拟)执行器服务?或者,我测试这个组件的困难是否表明这是一个需要重构的糟糕设计,或者可能是一个糟糕的测试场景?
备注
我想强调我的问题是没有设置 Mockito 或 Junit。其他模拟和测试工作正常。我的问题仅针对上面的特定模拟。
使用 :Junit 4.12,Mockito 1.10.19,Hamcrest 1.3
请您参考如下方法:
我认为以下代码在注入(inject) Mock 后运行。
@Before
public void initExecutor() throws Exception{
executor = Executors.newFixedThreadPool(2);
}
这会导致您的本地副本
executor要设置,但不是注入(inject)的那个。
我建议使用 constructor injection在您的
componentBeingAutowired并在您的单元测试中创建一个新的并排除 Spring 依赖项。您的测试可能如下所示:
public class MadeUpClassNameTest {
private ExecutorService executor;
@Before
public void initExecutor() throws Exception {
executor = Executors.newFixedThreadPool(2);
}
@Test
public void test() {
ASDF componentBeingTested = new ASDF(executor);
... do tests
}
}
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



