2014-06-30 61 views
0

的基于JUnit测试我使用ManagedExecutorService并发在我的代码是这样的:如何使用注射资源从服务器(如ManagedExecutorService)春季

@Resource 
private ManagedExecutorService defaultManagedExecutorService; 

它工作正常,如果我建立他们和部署他们我服务器,因为我引用服务器上的资源ManagedExecutorService:

<managed-executor-service name="default" jndi-name="java:jboss/ee/concurrency/executor/default" context-service="default" hung-task-threshold="60000" core-threads="5" max-threads="25" keepalive-time="5000"/> 

但我有Junit基于Spring的测试。为了运行这个测试,我不需要任何服务器。所以我得到以下异常:

Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.enterprise.concurrent.ManagedExecutorService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(mappedName=, shareable=true, description=, name=, type=class java.lang.Object, authenticationType=CONTAINER, lookup=)} 

看来春天无法从服务器找到我的资源。

我现在能做什么?

谢谢!

回答

1

您需要“模拟”该功能,意味着模拟真正处理类似的实现,但实际上并未到达服务器并检索JNDI资源,但使用假结果。

Spring中有一个包提供了测试JNDI资源的一些功能,你可以找到它的源代码here

要开始使用该包中的类,我会看看Spring自己的测试类,其中使用了那些JNDI模拟类。例如,请参阅here如何使用这些类来测试JTA事务管理器。

我还没有实际使用,但我会尝试这样的事:

import static org.mockito.BDDMockito.*; 
.... 
ManagedExecutorService mes = mock(ManagedExecutorService.class); 
ExpectedLookupTemplate jndiTemplate = new ExpectedLookupTemplate(); 
jndiTemplate.addObject("java:jboss/ee/concurrency/executor/default", mes); 
... 

或者你可以看看this为需要嘲笑一个ManagedExecutorService另一个测试类。

+0

非常感谢! – Manuela