2015-12-04 71 views
1

摘要:模拟的自动装配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

回答

5

我觉得素注射后,下面的代码运行。

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

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

我会建议在componentBeingAutowired上使用constructor injection并在您的单元测试中创建一个新的并排除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

您可以使用@Spy注释。

@RunWith(MockitoJUnitRunner.class) 
public class MadeUpClassNameTest{ 

    @Spy 
    private final ExecutorService executor = Executors.newFixedThreadPool(2); 

    .... 

} 
+0

在这种情况下,我得到了 'org.mockito.exceptions.base。MockitoException:无法初始化@Spy带注释的字段'someField'。 Mockito不能模拟这个类:java.util.concurrent.Executors $ FinalizableDelegatedExecutorService类。 Mockito只能模拟非私人和非最终的课程。 如果您不确定为什么会出现此错误,请向邮件列表报告。 基础异常:java.lang.IllegalStateException:调用java.lang.ClassLoader时发生错误#findClass' –

相关问题