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 继承的方法不会被视为生产者。