如何为Glassfish Embeddable EJBContainer + EclipseLink JPA设置JUnit测试?

时间:2011-04-12 14:16:17

标签: junit glassfish ejb eclipselink glassfish-embedded

我正在尝试在Glassfish 3.1上使用EJB 3.1 Embeddable EJBContainer进行集成 测试我的EJB。有一个我无法弄清楚的类加载问题。

我的ejbs被构建到dum-ejb.jar中。他们使用EclipseLink JPA。我还创建了EJB客户端jar dum-ejb-client.jar,同时试图解决类加载问题。客户端jar包含EJB接口和实体类(通常是参数或返回值)。客户端jar还包含许多可以删除的不需要的类(但我不知道它将如何解决问题)。

问题在于,由于EclipseLink将字节码编织到Entity类,因此在运行junit测试时,Entity类不能位于类路径中:http://www.java.net/forum/topic/glassfish/glassfish/embedded-glassfish-and-weaving

我可以这样做并配置classpath,以便不包含dum-ejb.jar。如果我使用EJBContainer以便我将我的服务作为java.lang.Object查找并通过反射调用它的方法,那么测试就可以了。但当然,这不是我想写我的测试的方式。

典型的测试如下:

@Test
   public void testInEJBContainer() throws Exception {

       File ejbJarFile = new File("target/dum/dum-ejb.jar");

       Map props = new HashMap();
       props.put("org.glassfish.ejb.embedded.glassfish.instance.root",
               "target/classes/instance-root");
       props.put(EJBContainer.MODULES, new File[]{ejbJarFile});
       EJBContainer container = EJBContainer.createEJBContainer(props);

       CompanyService = (CompanyService)
container.getContext().lookup("java:global/dum/CompanyServiceImpl");
       log.info("result of findAll() " + service.findAll(false));
   }

如果CompanyService接口和返回的公司实体类不能在类路径中,我怎么能运行测试?

即使dum-ejb.jar不在类路径上,而dum-ejb-client.jar也是如此,EclipseLink编织也会被破坏。

这不是EJBContainer的典型用例,不应该有一个简单的解决方案吗?

1 个答案:

答案 0 :(得分:0)

事实证明,自从我从maven ear项目运行EJBContainer以来,我遇到了类加载问题。

当我从maven ejb项目本身运行它时,没有这样的问题,EJBContainer很容易使用。