摘要:模拟的自动装配Autowired ExecutorService的
我有一个春天@Component
使用的自动装配Autowired的ExecutorService作为工作池。我正在使用JUnit和Mockito来测试组件的功能,我需要模拟该Executor服务。对于其他自动布线成员来说,这是微不足道的 - 一个通用的帮助器和一个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()
结果始终是一个空列表。
试图更明确地嘲笑执行方法也不起作用......
@Test
public void myTestMethod(){
when(executor.invokeAll(anyCollection()))
.thenCallRealMethod();
...
}
我得到的措辞若有所思例外:
无法使用验证或磕碰的外参数匹配器。
(我认为这是一个磕碰?)
我可以提供thenReturn(Answer<>)
方法,但我想,以确保该代码实际上与执行工作,的公平位代码专门用于映射期货结果。
问题 如何提供真实(或功能可用的模拟)执行程序服务?另外,我测试这个组件的难度是否意味着这是一个需要重构的糟糕设计,或者可能是一个糟糕的测试场景?
笔记 我想强调我的问题是没有得到Mockito或Junit的设置。其他嘲笑和测试正常工作。我的问题只针对上面的特定模拟。
使用:Junit的4.12,19年1月10日的Mockito,Hamcrest 1.3
在这种情况下,我得到了 'org.mockito.exceptions.base。MockitoException:无法初始化@Spy带注释的字段'someField'。 Mockito不能模拟这个类:java.util.concurrent.Executors $ FinalizableDelegatedExecutorService类。 Mockito只能模拟非私人和非最终的课程。 如果您不确定为什么会出现此错误,请向邮件列表报告。 基础异常:java.lang.IllegalStateException:调用java.lang.ClassLoader时发生错误#findClass' –