如何在容器外为Junit测试创建模拟的初始上下文。

问题描述 投票:0回答:2

我在运行jUnit测试时,在实例化weblogic初始上下文时遇到了很大的问题。应用程序使用Spring hibernate weblogic。在应用程序代码中,方法使用JMS代理发送消息到JMS,队列被设置在weblogic上。

我的问题是,目前在JUnit测试时,我需要让weblogic服务器在本地机器上运行,只是为了初始化WeblogicInitialContext,这在JMS代理中使用。我的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没有运行它就抛出异常。

我不想发送任何JMS消息,当我从Junit中调用这个方法时,我如何创建虚拟的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: 
hibernate spring weblogic junit4
2个回答
2
投票

处理这个问题的一个方法是这样的。

把你的应用配置分成两部分

  • 一个核心部分--在这里定义、注入、扫描你的普通类......。
  • 依赖于服务器的部分(包含所有不能在测试中创建的东西)

添加一个spring配置,同时导入这两个配置,当你启动你的应用程序时使用这个配置。

所以在测试时,你可以使用核心部分的配置。如果这个配置不能被实例化,因为一些Bean(形成服务器依赖部分)缺失,你需要模拟它们。这里你有两个选择。

  • 创建一个测试mock配置, 通过mocks模拟服务器依赖部分.
  • 你可以尝试在加载核心部分之前,将mock程序化地添加到应用程序上下文中。(更复杂)

无论如何,我强烈建议你重新思考你构建测试的方式。我强烈建议你重新思考你构建测试的方式. 也许更好的方法是完全不使用spring来构建一些(不是所有的)测试,而是手工创建被测类 (new)并手工 "注入 "测试所需的对象。测试中不需要的对象(完全不需要,或者因为这些对象只会增加测试的难度,而不会有更好的效果)应该用Mock代替。


为了创建mocked,我更倾向于使用mock框架来创建 jMock. 我已经实现了一个带有工厂方法的Helper类,它可以创建一个类,并为所有由@Autorwird@Ressourse注释的字段创建和注入Mocks。


0
投票

如果这是一个与生产应用程序共享的通用上下文,我会说,可以通过将JMS相关的bean移动到不同的上下文中来避免实例化数据库和JMS的东西,该上下文只由你的主应用程序加载,而不是测试代码。

但由于这是一个专门的测试上下文,你可能可以简单地删除那些不需要的bean,例如weblogic config和jndi上下文查找bean。如果你仍然需要一个jms队列来再次进行测试,你可以使用一个mock,如在 这个问题.

© www.soinside.com 2019 - 2024. All rights reserved.