在多模块maven项目中使用arquillian测试持久性EJB

时间:2012-10-01 08:45:09

标签: java-ee maven jpa java-ee-6 jboss-arquillian

我想使用Arquillian在使用JUnit测试时能够访问数据库。我已经能够访问EntityManager,但我需要做一些更复杂的事情。

该项目有几个模块,通常打包成耳朵。

  • ModuleA中,我有一个EJB的本地和远程接口,可以通过EntityManager访问数据库。

     public interface PersistenceLocal {
         public <T> T insert(T object);
         //....
     }
    
  • ModuleB中,我有一个实现这两个接口的类

     @Stateless
     @Local(ProcessServiceLocal.class)
     @Remote(ProcessServiceRemote.class)
     public class PersistenceImpl implements ProcessServiceRemote, ProcessServiceRemote{
    
         @PersistenceContext(unitName = PERSISTENCE_UNIT)
         private EntityManager entityManager;
    
         public <T> T insert(T object) {
             entityManager.persist(object);
             entityManager.flush();
             return object;
         }
         //....
    }
    
  • ModuleB取决于ModuleA来自Maven。

  • 我正试图在ModuleC的测试中访问数据库。此模块通过Maven在ModuleAModuleB上提供范围。

@RunWith(Arquillian.class)
public class testTest {

        @Deployment
        public static Archive<?> createDeployment() {
            File modA = Maven.resolver().resolve("group.id:modA:0.1")
               .withTransitivity().asSingle(File.class);

            File modB = Maven.resolver().resolve("group.id:modB:0.1")
               .withTransitivity().asSingle(File.class);
            //not sure of this step, but I'm just adding some libs.

            //If I don't add somewhere the test I have some 
            //error bc it cannot be found
            JavaArchive test = ShrinkWrap.create(
                JavaArchive.class, "sth.jar").addClass(testTest.class);

             EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class,"test.ear")
                .addAsLibrary(api)
                .addAsModule(test)
                .addAsModule(ejb);

             return ear;

        }

    @EJB
    PersistenceLocal persistence;

    @Test
    public void testPersistance() {
        Assert.assertNotNull(persistence);
    }
}

使用此配置部署的耳朵如下:

所有三个模块都打包为耳内的jar,但ModuleA位于耳朵的lib文件夹中。我正在使用带有远程JBoss 7.0.1的arquillian。正确设置了arquillian.xml和persistence.xml,因为我可以使用EntityManager进行访问。

我不知道的是我应该在包装上添加什么才能使其正常工作。我真的很挣扎,因为我不确定哪个是问题所在,因为所有课程都在不同的模块中,而且我是Arquillian的新手。

我现在得到的错误是:

org.jboss.arquillian.container.spi.client.container.DeploymentException: Could not deploy to container

Caused by: java.lang.Exception: {
"Failed services" => {"jboss.deployment.subunit.\"test.ear\".\"modB-357922373339836768.jar\".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.subunit.\"test.ear\".\"modB-357922373339836768.jar\".POST_MODULE: Failed to process phase POST_MODULE of subdeployment \"modB-357922373339836768.jar\" of deployment \"test.ear\""},
"Services with missing/unavailable dependencies" => [
    "jboss.naming.context.java.comp.test.test.test.ValidatorFactory missing [ jboss.naming.context.java.module.test.test ]",
    "jboss.naming.context.java.comp.test.test.test.Validator missing [ jboss.naming.context.java.module.test.test ]"
]
}

查看服务器日志:

Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: Could not load EJB class group.id.ejb.persistence.impl.persistenceImpl
at org.jboss.as.ejb3.deployment.processors.BusinessViewAnnotationProcessor.getEjbClass(BusinessViewAnnotationProcessor.java:197)
at org.jboss.as.ejb3.deployment.processors.BusinessViewAnnotationProcessor.deploy(BusinessViewAnnotationProcessor.java:77)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:115)
... 5 more
Caused by: java.lang.ClassNotFoundException: group.id.ejb.persistence.impl.persistenceImpl from [Module "deployment.test.ear.modB-6953783656278818077.jar:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:358)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:307)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:101)
at org.jboss.as.ejb3.deployment.processors.BusinessViewAnnotationProcessor.getEjbClass(BusinessViewAnnotationProcessor.java:195)
... 7 more

我查看了生成的临时jar(最终存储在磁盘上的某个位置),persistenceImpl.class正确位于jar中。也许有些类加载隔离问题? Shrinkwrap产生的耳朵内容:

[context=/test.jar]
[context=/lib/modA.jar]
[context=/modB.jar]

0 个答案:

没有答案