运行集成测试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.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180)中的orb初始化erorr,位于com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365) )com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372)位于com.sun.enterprise的com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402) . 位于com.sun.enterprise.nam.nmpl.SerialContext.lookup的com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504)中的naming.impl.SerialContext.getProvider(SerialContext.java:347)( SerialContext.java:455)位于sun.reflect.NativeMethodAccessorImpl.invoke0的no.breakpoint.ejbbook.calculator.test.SimpleCalculatorIntegrationTest.obtainProxyReferences(SimpleCalculatorIntegrationTest.java:24)的javax.naming.InitialContext.lookup(InitialContext.java:392) (本地方法)at sun.re的sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) flect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:44)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)org.junit.internal.runners.statements . 在org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)的org.junit.runners.ParentRunner.run(ParentRunner.java:236)运行RunBefores.evaluate(RunBefores.java:27)在org.eclipse上的org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) org.ecli上的org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)中的.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) pse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)由org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152)中的java.lang.NullPointerException引起 . ..还有23个

回答(1)

2 years ago

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

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

  • 测试 outside-of-the-container . 这意味着您的测试在不同的JVM上作为不同的应用程序运行 . 在这种情况下,您需要使用 Remote 接口EJB视图和JNDI来定位EJB . JNDI坐标的构造如EJB 3.1 specification中关于可移植JNDI语法(p.81)所述 . 如果是Glassfish你只需要:

  • 将远程接口添加到类路径(以便能够使用它),

  • 将gf-client.jar添加到类路径中 .

然后,您可以通过调用与此类似的代码来定位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.测试 inside-of-the-container . 这意味着您的测试在容器内执行,并且很可能与您的应用程序一起执行 . 这允许您使用依赖注入,EntityManagers,本地/无接口EJB的视图等 . 使用JBoss Arquillian,您只需假设已为您提供所有服务即可编写测试 .

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