我在将测试源中的Producer
注入EntityManager
到主源中的服务时遇到问题。目的是将该库嵌入到另一个项目中,在该项目中,项目将使用它自己的PersistenceContext
unitName定义Producer
。如果我在主要来源中没有生产者,我会得到Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName MY_PU
错误。使用maven和嵌入式玻璃鱼的CDI类路径问题
例如:
/** src/main/java/org/sample/service */
@Stateless
public class MyBean {
@Inject
@MyCustomQualifier
private EntityManager em;
}
/** src/test/java/org/sample/service */
public class EntityManagerProducer {
@Produces
@MyCustomQualifier
@PersistenceContext(unitName = "MY_PU")
private EntityManager em;
}
为了让我来测试服务,我必须使用maven蚂蚁插件的* .class文件移动到target/classes
目录和包装阶段之前将其删除。这工作,但它是kludgy。我试过在surefire插件中更改<useSystemClassLoader>
和<useManifestOnlyJar>
参数,但没有成功。
还有别的办法吗?
我的环境
- 的Maven:2.2.1
- 神火:2.4.2
- GlassFish的嵌入式全:3.1.1
编辑
beans.xml存在于(test/main)/ resources/META-INF
我开始GF容器如下。
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(EJBContainer.MODULES, new File[]{new File("target/classes"), new File("target/test-classes")});
EJBContainer ejbContainer = EJBContainer.createEJBContainer(properties);
Context ctx = ejbContainer.getContext();
MyBean service = ctx.lookup("java:global/ejb-app/classes/MyBean");
听起来像项目中的库和类与glassfish加载的内容相冲突。我从来没有对嵌入式容器和maven好运,因为maven不能保持classpath的清洁。如果你在一个新的vm中启动glassfish会发生什么? – LightGuard 2012-03-27 16:52:25
@LightGuard:默认情况下,surefire forkMode是'once'。所以嵌入式容器应该与maven分开的JVM。 (参考)(http://stackoverflow.com/questions/6813373/how-to-tell-maven2-to-execute-junit-tests-one-by-one-each-in-new-jvm-instance) – Hoon 2012-03-27 18:31:35