Jakarta ee 使用JUnit和glassfish 4进行远程EJB测试

Jakarta ee 使用JUnit和glassfish 4进行远程EJB测试,jakarta-ee,junit,glassfish,ejb-3.1,Jakarta Ee,Junit,Glassfish,Ejb 3.1,我正在从事ejb3bean的自动化测试。我已使用以下代码创建了一个示例应用程序: (测试环境基于4个模块:EJB客户机、EJB、EAR(包含EJB客户机和EJB)以及junit tester项目) 接口: package remote.test; import javax.ejb.Remote; @Remote public interface TestBeanRemote { public void method1(); public int method2(); } EJB: 为

我正在从事ejb3bean的自动化测试。我已使用以下代码创建了一个示例应用程序:

(测试环境基于4个模块:EJB客户机、EJB、EAR(包含EJB客户机和EJB)以及junit tester项目)

接口:

package remote.test;
import javax.ejb.Remote;
@Remote
public interface TestBeanRemote {
public void method1();  
public int method2();   
}
EJB:

为了帮助Junit测试,我使用带有默认设置的Glassfish4 ORB/IIOP端口

我有一个实用程序类用于设置:

import java.util.Properties;
public class Util {
public static Properties getInitProperties() {
Properties result = new Properties();
result.setProperty("java.naming.factory.initial",
                   "com.sun.enterprise.naming.SerialInitContextFactory");
result.setProperty("java.naming.factory.url.pkgs",
                "com.sun.enterprise.naming");
result.setProperty("java.naming.factory.state",
                "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
result.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
result.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
return result;
}
}
下面是测试代码:

import static org.junit.Assert.*;
import javax.naming.InitialContext;
import org.junit.Before;
import org.junit.Test;
import remote.test;
public class JunitTester {
private TestBeanRemote testBean;
@Before
    public void setUp() throws Exception {
InitialContext context = new InitialContext(Util.getInitProperties());
testBean = (TestBeanRemote ) context.lookup("java:global/.../Testbean!...TestBeanRemote");
}
@Test
public void methodTest(){
    long n = testBean.method2();
    assertEquals(42, n);
}
}
(“上面的“…”是指整个包装的缩短)

在这一点上,一切都起作用了。这听起来不错,所以我想在一个特定的应用程序中实现它,在这个应用程序中我遇到了问题

因此,我有一个现有的应用程序,其中我有以下模块: 耳朵: JPA模块 EJB客户端模块 ejbimpl。模块 战争舱

另外,我还创建了一个简单的java应用程序项目,我希望在其中实现与上面相同的测试。 因此,我添加了与上面相同的实用程序类,并添加了相同的junit测试代码,其中更改了

 private TestBeanRemote testBean;
将jndi名称更改为相应的名称(jdni名称均由glassfish提供)

这不起作用,我在.lookup()方法中得到一个NullPointerException:

我不知道为什么。这两个应用程序运行在同一台glassfish服务器上。我试图比较这些代码,但唯一的区别是我现有的远程bean具有EntityManager persistencecontext

有人知道我应该在哪里寻找问题吗?什么可能导致此错误


谢谢你的帮助

我发现了不同之处。出于某种原因,这两个项目都引用了glassfish 3.1中的gf-client-module.jar(两个glassfish安装彼此相邻)


较大的项目没有运行,因为它引用了新的API(比如JPA2或JSF 2.2),所以我得到了给定的错误。它将使您能够在真正的容器中运行测试,而无需关心细节。是的,但就我们的目的而言,Arquillian是不够的。

 private TestBeanRemote testBean;
java.lang.NullPointerException
at com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:347)
at com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:354)
at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:384)
at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:329)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:477)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
at javax.naming.InitialContext.lookup(InitialContext.java:411)