spring - 模拟 Autowired ExecutorService

标签 spring unit-testing mockito executorservice

摘要:

我有一个 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
    }
}

关于spring - 模拟 Autowired ExecutorService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34097159/

相关文章:

java - JUnit4 中静态内部测试类的嵌套测试设置

Java Mockito : Test a protected abstract method

java - 在第 1 行的 'update, stock_id) values (0, 0.0, 10018, 1, null, 0, null, 0)' 附近使用正确的语法

java - 如何在 Spring Boot 中重载 KafkaListener 方法

java - 有人可以解释一下这个和目标切入点指示符吗

c# - 在哪里构建一次性依赖项以提高可测试性?

android - Kotlin Result<T> 在单元测试中的问题

java - hbm2ddl 模式导出不会导致使用 Spring Security 创建实体

c++ - 在 TFS 测试阶段运行 C++ 单元测试

android - RxJava 的模拟单元测试