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 ответ

Решение

Вам нужно поместить методы вашего производителя в отдельный класс от DBUnitBaseTest. Этот класс является абстрактным и не может использоваться в качестве производителя CDI. Оба метода производителя для em и logger.

Это связано с тем, что класс, имеющий методы / поля производителя, должен быть самим компонентом CDI - экземпляр этого класса создается CDI до вызова методов производителя. И CDI не может создавать бины из абстрактного класса. Также, @Producer аннотации не наследуются, поэтому методы наследуются SurveyBeanTest не рассматриваются как производители.

Другие вопросы по тегам