运行集成测试EJB的问题

时间:2011-10-11 18:55:44

标签: java java-ee junit ejb

Enterprise JavaBeans 3.1中的代码第4章。如果您需要更多代码或信息,请询问!

public class SimpleCalculatorIntegrationTest {

    private static SimpleCalculatorBean calc;
    private static Context namingContext;
    private static final String JNDI_NAME_CALC = "java:global/SimpleCalculatorEJB/SimpleCalculatorBean";

    @BeforeClass
    public static void obtainProxyReferences() throws NamingException {
        namingContext = new InitialContext();

        calc = (SimpleCalculatorBean) namingContext.lookup(JNDI_NAME_CALC);
    }

    @Test
    public void testAddition() {

        int expectedSum = 1 + 2 + 3 + 4; // 10

        assertEquals(expectedSum, calc.add(1, 2, 3, 4));
    }
}

堆栈跟踪:

  

11.okt.2011 20:41:28 com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl   findDerbyClient INFO:找不到javadb客户端jar文件,derby jdbc   默认情况下,驱动程序不可用。了java.lang.RuntimeException:   Orb初始化erorr at   org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180)     在   com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365)     在   com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372)     在   com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402)     在   com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347)     在   com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504)     在   com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)     在javax.naming.InitialContext.lookup(InitialContext.java:392)at   no.breakpoint.ejbbook.calculator.test.SimpleCalculatorIntegrationTest.obtainProxyReferences(SimpleCalculatorIntegrationTest.java:24)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     在java.lang.reflect.Method.invoke(Method.java:597)at   org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:44)     在   org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)     在   org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)     在   org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)     在org.junit.runners.ParentRunner.run(ParentRunner.java:236)at   org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)     在   org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)     在   org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)     在   org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)     在   org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)     在   org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)   引起:java.lang.NullPointerException at   org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152)     ......还有23个

1 个答案:

答案 0 :(得分:4)

只是为其他感兴趣的用户总结我们的聊天对话:

您可以通过两种方式编写适用于EJB的测试:

  1. 测试容器外。这意味着您的测试在不同的JVM上作为不同的应用程序运行。在这种情况下,您需要使用远程接口EJB视图和JNDI来定位EJB。 JNDI坐标的构造如EJB 3.1 specification中关于可移植JNDI语法(p.81)所述。如果是Glassfish你只需要:
    • 将远程接口添加到类路径(以便能够使用它),
    • 将gf-client.jar添加到您的类路径中。
  2. 然后,您将能够通过调用与此类似的代码来找到EJB的远程接口:

    public class Main {
    
        private static final String JNDI = 
                        "java:global/yourApp/YourEJBBean!com.test.YourEJBBeanRemote";
    
        public static void main(String[] args) throws NamingException {
            Context ctx = new InitialContext();
    
            YourEJBBeanRemote sr = (YourEJBBeanRemote)ctx.lookup(JNDI);
    
            // Invoke some method on 'sr'
        }
    }
    

    2。测试容器内部。这意味着您的测试在容器内执行,并且很可能与您的应用程序一起执行。这允许您使用依赖注入,EntityManagers,本地/无接口EJB的视图等。使用JBoss Arquillian,您只需假设已为您提供所有服务即可编写测试。

    EJB 3.1新的无界面视图就像本地视图一样,因此它不能用于驻留在应用程序之外的客户端。