我在运行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:
处理这个问题的一个方法是这样的。
把你的应用配置分成两部分
添加一个spring配置,同时导入这两个配置,当你启动你的应用程序时使用这个配置。
所以在测试时,你可以使用核心部分的配置。如果这个配置不能被实例化,因为一些Bean(形成服务器依赖部分)缺失,你需要模拟它们。这里你有两个选择。
无论如何,我强烈建议你重新思考你构建测试的方式。我强烈建议你重新思考你构建测试的方式. 也许更好的方法是完全不使用spring来构建一些(不是所有的)测试,而是手工创建被测类 (new
)并手工 "注入 "测试所需的对象。测试中不需要的对象(完全不需要,或者因为这些对象只会增加测试的难度,而不会有更好的效果)应该用Mock代替。
为了创建mocked,我更倾向于使用mock框架来创建 jMock. 我已经实现了一个带有工厂方法的Helper类,它可以创建一个类,并为所有由@Autorwird@Ressourse注释的字段创建和注入Mocks。
如果这是一个与生产应用程序共享的通用上下文,我会说,可以通过将JMS相关的bean移动到不同的上下文中来避免实例化数据库和JMS的东西,该上下文只由你的主应用程序加载,而不是测试代码。
但由于这是一个专门的测试上下文,你可能可以简单地删除那些不需要的bean,例如weblogic config和jndi上下文查找bean。如果你仍然需要一个jms队列来再次进行测试,你可以使用一个mock,如在 这个问题.