当前位置:  开发笔记 > 编程语言 > 正文

模拟自动执行的ExecutorService

如何解决《模拟自动执行的ExecutorService》经验,为你挑选了1个好方法。

抽象:

我有一个Spring @Component使用自动装配的ExecutorService作为工作池.我正在使用JUnit和Mockito来测试组件的功能,我需要模拟Executor服务.对于其他自动装配的成员来说这是微不足道的 - 通用助手,例如DAO层很容易被模拟,但我需要一个真正的 Executor服务.

码:

@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<>)方法,但我想确保代码实际上与执行者一起工作,相当一部分代码专门用于映射Futures的结果.

问题 如何提供真实(或功能可用的模拟)Executor服务?或者,我是否难以测试这个组件,这表明这是一个需要重构的糟糕设计,或者可能是一个糟糕的测试场景?

注意 我想强调我的问题是没有设置Mockito或Junit.其他模拟和测试工作正常.我的问题仅针对上面的特定模拟.

使用:Junit 4.12,Mockito 1.10.19,Hamcrest 1.3



1> LucasP..:

我认为以下代码在注入Mock之后运行.

@Before
public void initExecutor() throws Exception{
  executor = Executors.newFixedThreadPool(2);
}

这会导致您的本地副本executor被设置,但不会被注入.

我建议在你的单元测试中使用构造函数注入并在componentBeingAutowired其中创建一个新的依赖项.您的测试可能如下所示:

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
    }
}

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有