如何使用Mockito注入JMS依赖项

时间:2014-04-15 10:26:01

标签: java jms mockito junit4

我有一个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 );
}
 ..
 ..
 ..
  }

2 个答案:

答案 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