2011-04-12 155 views
0

我正面臨着大問題實例化weblogic運行jUnit測試時的初始上下文。 應用程序使用Spring/hibernate/weblogic。 在應用程序代碼中,方法使用JMS代理向JMS發送消息,隊列在weblogic上設置。如何創建模擬/虛擬初始上下文Junit測試容器外

我的問題是當JUnit測試當前我需要保持weblogic服務器在本地機器上運行只是爲了初始化JMS代理中使用的WeblogicInitialContext。我的junit測試不需要發送任何東西到服務器,沒有JMS,沒有數據源。所有這些都受春季單元測試框架的管理。 我想爲我的junit測試解耦/擺脫Weblogic。請建議。 這裏是我的代碼:

這是我測試的應用程序上下文XML:

<beans xmlns="http://www.springframework.org/schema/beans" 
... 
> 

<bean id="transactionManager" 
class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<util:properties id="webLogicInitialContext"> 
    <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop> 
    <prop key="java.naming.provider.url">t3://localhost:7001</prop> 
    <prop key="java.naming.security.principal">admin</prop> 
    <prop key="java.naming.security.credentials">password</prop> 
</util:properties> 

<jee:jndi-lookup id="responseProxyConnectionFactory" 
    jndi-name="jms/ConnectionFactory" environment-ref="webLogicInitialContext"/> 

<bean id="responseProxyJmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" 
     ref="responseProxyConnectionFactory" /> 
</bean> 
</beans> 

這是一個Java類方法:

public class Order { 
public void addOrder(OrderRequest addOrderRequest) { 
    PurchaseOrder newOrder = orderHelper.createOrder(addOrderRequest); 
    orderDaoHibernate.addOrder(newOrder); 
    responseProxy.send(newOrder); 

} 
} 

我的測試:

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({TransactionalTestExecutionListener.class, DependencyInjectionTestExecutionListener.class,DirtiesContextTestExecutionListener.class }) 
@ContextConfiguration(locations={"/test-application-context.xml"}) 
@TransactionConfiguration(defaultRollback=true) 

public class TestOrder { 

@Test 
@Transactional 
public void testMyOrder(){ 
Order ord = new Order(); 
OrderRequest req = new OrderRequest(); 
.... 
ord.addOrder(req); 
} 

}

如果我運行這個測試,Spring框架嘗試加載WeblogicInitialContext,並且如果本地weblogic未運行,則會拋出異常。

當我從Junit調用此方法時,我不想發送任何JMS消息。 如何創建虛擬WeblogicInitialContext。

請幫忙。

異常的某些部分;

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean  with name 'responseProxyConnectionFactory': Invocation of init method failed; nested exception is javax.naming.CommunicationException [Root exception is java.net.ConnectException: t3://localhost:7001: Destination unreachable; nested exception is: 
+0

這裏的一些解決方案:[如何在單元測試中模擬InitialContext構造函數](https://stackoverflow.com/q/36734275/772981)。 – Jarekczek 2017-06-29 07:32:34

回答

0

如果這是你與你的生產應用程序共享一個共同的背景下,我要說的是,可避免通過移動JMS相關豆成一個不同的背景下,僅由加載實例數據庫和JMS的東西你的主應用程序,而不是測試代碼。

但是,由於這是一個專用的測試環境,因此您可以簡單地刪除那些不需要的bean,例如weblogic配置和jndi上下文查找bean。如果您仍需要jms隊列再次測試,則可以使用模擬,如this SO question中所述。

+0

我試過了。如果我刪除這些weblogic配置bean,它會開始拋出InitialContext無法找到的其他異常。等等。主要是我的應用程序中的所有方法都通過代理髮送JMS,並在我的config xml中reponseProxy使用weblogicContext。在我的代碼中,我可以更改/放置一個開關,當單元測試調用時不發送JMS,但問題是SPRING在加入代碼之前加載所有配置XML。我不想避免任何初始上下文的負載,或者使用一些模擬的InitialContext。 – utsuk 2011-04-12 15:51:01

2

一個處理這個問題的方法是這樣的:

分成兩個部分應用程序的配置,

  • 的核心部分 - 在您的正常類定義,注入,掃描,...
  • 服務器相關的部分(含其無法在測試中創建的所有東西)

添加彈簧的配置,即導入他們兩個,並使用THI當你開始你的申請。

因此,對於測試,您可以使用核心部分配置。如果這個配置不能實例化,因爲一些bean(從服務器依賴的部分)缺失,你需要嘲笑它們。在這裏你有兩個選擇:

  • 創建一個測試模擬配置,模擬服務器相關部分的模擬。
  • 在加載核心部分之前,您可以嘗試將模擬程序添加到應用程序上下文中。 (更復雜)

無論如何:我強烈建議重新考慮你建立測試的方式。可能更好的方法是在沒有彈簧的情況下完全構建一些(不是全部)測試,並手動創建待測試的類(new),然後手動「注入」測試所需的對象。測試中不需要的對象(完全是因爲使測試更困難但不是更好)應該由Mocks取代。


創造嘲笑,我prefere嘲諷framwork jMock。我用Factory方法實現了一個Helper類,它創建一個類,併爲由@ Autorwird/@ Ressourse註釋的所有字段創建並注入Mocks。

+0

Tks。這就是問題所在,我如何創建模擬服務器端部分。我如何在我的spring配置文件中模擬WeblogicInitialContext?我只是不想加載這個上下文。但代碼中的代理正在使用它。控制永遠不會去代碼級別,但我的測試失敗,初始化春天配置文件本身。 – utsuk 2011-04-12 16:05:46

+0

@utsuk:我已經延長了我的飲食。這是你要求的嗎? – Ralph 2011-04-12 16:20:31

+0

Tks Ralph。我目前沒有使用任何模擬框架,但看看你提到的這個jMock。實際上我正在尋找的是一種通過我的spring配置文件中的某種方式來模仿WLInitialContextFactory的方法。就像將其替換爲其他類型的上下文工廠一樣,這樣我就不需要在本地啓動weblogic。我只是希望我的測試在加載spring配置文件時不會失敗,因爲它找不到WLInitialContextFactory。例如。替換它與一些虛擬工廠說dummyContectFactory或「SpringInitialContextFactory」 – utsuk 2011-04-12 16:33:40