【发布时间】:2014-06-27 09:29:24
【问题描述】:
我正在从事 EJB3 bean 的自动化测试。我已经成功创建了一个示例应用程序,代码如下:
(测试环境基于 4 个模块:EJB 客户端、EJB、EAR - 包含 ejb 客户端和 ejb - 以及 junit 测试器项目)。
界面:
package remote.test;
import javax.ejb.Remote;
@Remote
public interface TestBeanRemote {
public void method1();
public int method2();
}
EJB:
package remote.test
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Remote
@Stateless
public class Testbean implements TestBeanRemote {
public Testbean() {
}
@Override
public void method1() {
}
@Override
public int method2() {
return 42;
}
}
为了帮助 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 客户端模块 EJB 实现。模块 WAR模块
另外,我创建了一个简单的 java 应用程序项目,我想在其中实现与上面相同的测试。 所以我添加了与上面相同的实用程序类,并添加了相同的junit测试代码,我已经更改了
private TestBeanRemote testBean;
到我的应用程序的现有远程接口 bean,并将 jndi 名称更改为相应的名称(jdni 名称均由 glassfish 给出)。
这不起作用,我在 .lookup() 方法处得到 NullPointerException:
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)
我找不到原因。这两个应用程序在同一个 glassfish 服务器上运行。我试图比较代码,但唯一的区别是我现有的远程 bean 具有 EntityManager persistencecontext。
有人知道我应该在哪里寻找问题吗?什么可能导致此错误?
感谢您的帮助!
【问题讨论】:
-
您是否考虑过使用Arquillian 进行测试?它将使您能够在真实容器中运行测试,而无需关心细节。
-
是的,但对我们而言,Arquillian 还不够。
标签: jakarta-ee junit glassfish ejb-3.1