CDI-Unit @Produces无效

时间:2015-10-06 18:59:26

标签: java unit-testing cdi producer cdi-unit

首先我用谷歌搜索,根据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:带有限定符的类型Logger的不满意依赖关系@Default   在注入点[BackedAnnotatedField] @Inject private at.fhhagenberg.unitTesting.beans.SurveyBean.log   ...

这意味着CdiRunner尝试构建我的SurveyBean并注入记录器,但它找不到要注入的对象,尽管我在基类中专门生成它(对于EntityManager也是如此)。

有人知道如何解决这个问题吗?

PS:标签我不允许添加:cdi-unit,jglue

1 个答案:

答案 0 :(得分:2)

您需要将生产者方法放入与DBUnitBaseTest不同的类中。此类是抽象的,不能用作CDI生成器。 em和logger的两种生产者方法。

这是因为具有生成器方法/字段的类必须是CDI bean本身 - 该类的实例是在调用生产者方法之前由CDI创建的。 CDI无法从抽象类创建bean。此外,@Producer注释不会被继承,因此SurveyBeanTest继承的方法不会被视为生成器。