2014-06-30 95 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