模拟自动连线的执行器服务



摘要:

我有一个Spring @Component,它使用一个自动连接的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()的结果总是一个空列表。

试图更明确地模拟executor方法也不起作用。。。

@Test
public void myTestMethod(){
    when(executor.invokeAll(anyCollection()))
        .thenCallRealMethod();
    ...
}

我得到了措辞隐晦的例外:

不能在验证或存根之外使用参数匹配器。

(我以为这是一次重击?)

可以提供一个thenReturn(Answer<>)方法,但我想确保代码实际上与执行器一起工作,其中相当一部分代码用于映射Futures的结果。

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

备注我想强调的是,我的问题不是设置Mockito或Junit。其他模拟和测试工作正常。我的问题只针对上面的特定mock。

使用:Junit 4.12、Mockito 1.10.19、Hamcrest 1.3

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

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

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

我建议在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
    }
}

另一种方法是使用ReflectionTestUtils注入执行程序

@Before
public void initExecutor() {
  ReflectionTestUtils.setField(componentBeingAutowired, "executor", Executors.newFixedThreadPool(2);
}

您可以使用@Spy注释。

@RunWith(MockitoJUnitRunner.class)
public class MadeUpClassNameTest{
    @Spy
    private final ExecutorService executor = Executors.newFixedThreadPool(2);
    ....
}

您可以使用@Spy注释。

@RunWith(MockitoJUnitRunner.class)
public class MadeUpClassNameTest{
@Spy
private final ExecutorService executor = Executors.newFixedThreadPool(2);
@Test
...
}

相关内容

  • 没有找到相关文章

最新更新