2011-10-11 126 views
0

來自Enterprise JavaBeans 3.1的第​​4章代碼如果您需要更多的代碼或信息,請問!運行集成測試的問題EJB

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信息:找不到JavaDB之外的客戶端jar文件,JDBC德比 驅動程序默認情況下不可用。了java.lang.RuntimeException:在 org.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.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)在 no.breakpoint.ejbbook.calculator.test.SimpleCalculatorIntegrationTest .obtainProxyReferences(SimpleCalculatorIntegrationTest.java:24) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl .java:25) at java.lang.reflect.Method.invoke(Method.java:597)at 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.RunBefores.evaluate(RunBefores.java:27) at org.junit.runners.ParentRunner.run(ParentRunner.java:236)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)(JUnit4TestReference.java:50) (RemoteTestRunner.java:467) at org.eclipse.jdt.inter nal.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在 org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152) .. 。23多

+0

您是否在容器中執行測試(即使用Arquillian?)。 如果您在容器外運行,請確保您沒有使用本地或非接口EJB視圖,因爲您試圖從另一個JVM訪問它。 –

+0

@PedroKowalski你有5分鐘來參加Java聊天嗎?我真的會提供一些幫助,以便繼續下一章。 – LuckyLuke

回答

4

只是爲了總結我們的聊天對話爲其他感興趣的用戶:

你可以寫兩種方式在你的EJB的工程測試:

  1. 測試之外的最 - 集裝箱。這意味着您的測試在不同的JVM上作爲不同的應用程序運行。在這種情況下,您需要使用接口EJB視圖和JNDI來定位您的EJB。關於可移植的JNDI語法(p。81),構建如在EJB 3.1 specification中所寫的JNDI座標。在Glassfish的情況下,你只需要:
    • 遠程接口添加到類路徑(能夠使用它),
    • 的GF-client.jar中添加到類路徑。裏面的最容器

      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.測試

然後你就可以通過調用代碼有點類似於此找到您的EJB的遠程接口。這意味着您的測試在容器中執行,很可能與您的應用程序一起執行。這允許您使用依賴注入,EntityManagers,本地/無界面EJB的視圖等。通過JBoss Arquillian,您只需假設所有服務都爲您提供了測試就可以編寫測試。

EJB 3.1新的無接口視圖就像本地視圖一樣,因此它不能用於駐留在應用程序之外的客戶端。