2011-04-12 156 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