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

时间:2014-06-27 09:29:24

标签: java-ee junit glassfish ejb-3.1

我正在研究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 impl。模 WAR模块

另外,我已经创建了一个简单的java应用程序项目,我想在其中实现相同的测试,如上所述。 所以我添加了与上面相同的实用程序类,并添加了相同的junit测试代码,我已经更改了

 private TestBeanRemote testBean;

到我的应用程序的现有Remote接口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。

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我发现了差异。出于某种原因,两个项目都引用了glassfish 3.1中的gf-client-module.jar(两个玻璃鱼装置彼此靠近)。

更大的项目没有运行,因为它引用了更新的api(比如JPA2或JSF 2.2),所以我得到了给定的错误。