CDI-Unit @Produces 不工作
CDI-Unit @Produces not working
首先,我在谷歌上进行了大量搜索,并根据 http://jglue.org/cdi-unit-user-guide/ 生成要注入到单元测试中的东西应该可以正常工作。
我的设置:
@RunWith(CdiRunner.class)
public abstract class CdiUnitBaseTest extends DBUnitBaseTest {
@Produces
public EntityManager em() {
return em; //field from base class filled @BeforeClass
}
@Produces
public Logger logger() {
return LogManager.getLogger();
}
}
public class SurveyBeanTest extends CdiUnitBaseTest {
@Inject
private SurveyBean bean;
@Test
public void surveyWithoutParticipation() {
Survey s = new Survey();
s.setParticipation(new ArrayList<Participation>());
boolean result = this.bean.hasParticipated("12ST", s);
Assert.assertFalse(result);
}
}
@Remote(SurveyRemote.class)
@Stateless
public class SurveyBean implements SurveyRemote {
@Inject
private Logger log;
@Inject
private SurveyDao sDao;
@Inject
private ParticipationDao pDao;
...
}
异常:
org.jboss.weld.exceptions.DeploymentException:有 3 个例外的例外列表:
异常 0:
org.jboss.weld.exceptions.DeploymentException:WELD-001408:带有限定符 @Default 的类型 Logger 的依赖关系不满足
在注入点 [BackedAnnotatedField] @Inject private at.fhhagenberg.unitTesting.beans.SurveyBean.log
...
这意味着 CdiRunner 尝试构建我的 SurveyBean 并注入记录器,但它找不到要注入的对象,尽管我专门在基础中生成它 class(EntityManager 也是如此)。
有人知道如何解决这个问题吗?
PS:不允许我添加的标签:cdi-unit、jglue
您需要将生产者方法与 DBUnitBaseTest 分开 class。这个class是抽象的,不能作为CDI生产者。 em 和 logger 的生产者方法。
这是因为具有生产者 methods/fields 的 class 必须是 CDI bean 本身 - class 的一个实例是由 CDI 在调用生产者方法之前创建的。而且 CDI 不能从抽象 class 创建 bean。此外,@Producer
注释不会被继承,因此 SurveyBeanTest
继承的方法不会被视为生产者。
首先,我在谷歌上进行了大量搜索,并根据 http://jglue.org/cdi-unit-user-guide/ 生成要注入到单元测试中的东西应该可以正常工作。
我的设置:
@RunWith(CdiRunner.class)
public abstract class CdiUnitBaseTest extends DBUnitBaseTest {
@Produces
public EntityManager em() {
return em; //field from base class filled @BeforeClass
}
@Produces
public Logger logger() {
return LogManager.getLogger();
}
}
public class SurveyBeanTest extends CdiUnitBaseTest {
@Inject
private SurveyBean bean;
@Test
public void surveyWithoutParticipation() {
Survey s = new Survey();
s.setParticipation(new ArrayList<Participation>());
boolean result = this.bean.hasParticipated("12ST", s);
Assert.assertFalse(result);
}
}
@Remote(SurveyRemote.class)
@Stateless
public class SurveyBean implements SurveyRemote {
@Inject
private Logger log;
@Inject
private SurveyDao sDao;
@Inject
private ParticipationDao pDao;
...
}
异常:
org.jboss.weld.exceptions.DeploymentException:有 3 个例外的例外列表:
异常 0: org.jboss.weld.exceptions.DeploymentException:WELD-001408:带有限定符 @Default 的类型 Logger 的依赖关系不满足 在注入点 [BackedAnnotatedField] @Inject private at.fhhagenberg.unitTesting.beans.SurveyBean.log ...
这意味着 CdiRunner 尝试构建我的 SurveyBean 并注入记录器,但它找不到要注入的对象,尽管我专门在基础中生成它 class(EntityManager 也是如此)。
有人知道如何解决这个问题吗?
PS:不允许我添加的标签:cdi-unit、jglue
您需要将生产者方法与 DBUnitBaseTest 分开 class。这个class是抽象的,不能作为CDI生产者。 em 和 logger 的生产者方法。
这是因为具有生产者 methods/fields 的 class 必须是 CDI bean 本身 - class 的一个实例是由 CDI 在调用生产者方法之前创建的。而且 CDI 不能从抽象 class 创建 bean。此外,@Producer
注释不会被继承,因此 SurveyBeanTest
继承的方法不会被视为生产者。