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
не рассматриваются как производители.