我想使用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在ModuleA
和ModuleB
上提供范围。
@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]