我有一个servlet,我正在为它编写测试用例,让它已经工作但是在代码的末尾有一些JMS调用正在抛出异常“javax.naming.NameNotFoundException”,我有这个错误的EJB bean以及数据源,所以我把它们注入@BeforeClass并且它们工作正常我现在需要为JMS调用做同样的事情如下。
我在servlet中的jms调用如下。
ctx=new InitialContext();
queueConnectionFactory=(QueueConnectionFactory) ctx.lookup("jms/queueConnectionFactory");
queue=(Queue) ctx.lookup("jms/reportQueue");
queueConnection=queueConnectionFactory.createQueueConnection();
queueSession=queueConnection.createQueueSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
queueSender=queueSession.createSender(queue);
message=queueSession.createObjectMessage(etEDocRequestParams);
queueSender.send(message);
但我不知道如何在没有容器的情况下将JMS对象插入Jndi。请帮忙。
我的测试@beforeclass正在创建一个假的InitialContext,它正在用于获取DataSource并使用EJBMOCK,它也适用于EJB。请看下面的代码。
public class BookingSaveTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.evermind.sql.DriverManagerDataSource");
ds.setJdbcUrl("jdbc:oracle:thin:@192.168.74.49:1521:xyz");
ds.setUser("devpxyz");
ds.setPassword("pass123");
ds.setMaxPoolSize(1);
ds.setMaxPoolSize(15);
ds.setAcquireIncrement(3);
ds.setMaxStatementsPerConnection(100);
//ds.setAutomaticTestTable("c3p0_test_table");
ds.setNumHelperThreads(20);
SimpleNamingContextBuilder builder = null;
builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
builder.bind("java:comp/env/jdbc/DB", ds);
//bellow this is mocking EJB container
MockContextFactory.setAsInitial();
// Create an instance of the MockContainer and pass the JNDI context that
// it will use to bind EJBs.
MockContainer mockContainer = new MockContainer( new InitialContext() );
SessionBeanDescriptor statefulSampleDescriptor =
new SessionBeanDescriptor( "PRQSessionBean",
PRQSessionHome.class, PRQSession.class, PRQSessionBean.class );
// Mark this bean as stateful. Stateless is the default.
statefulSampleDescriptor.setStateful( true );
mockContainer.deploy( statefulSampleDescriptor );
}
..
..
..
}
答案 0 :(得分:1)
您的问题不在于JMS,而在于JNDI。您需要在JNDI注册表中注册JMS模拟,如果您在应用程序服务器外部进行测试,则很可能根本没有正确设置。
这个问题基本上是针对同一问题提出的,应该可以帮助您解决问题:Junit Testing JNDI InitialContext outside the application server
答案 1 :(得分:0)
如果你必须伪造JMS,JNDI和EJB,mockEJB提供了所有这些,我没有完全阅读它,我认为它只是针对EJB。您拥有其中定义的所有接口的实现类,您可以轻松地将它们绑定到您的上下文。 http://mockejb.sourceforge.net/javadoc/index.html