2015-10-06 5 views
1

Сначала я интенсивно работал в googled и в соответствии с http://jglue.org/cdi-unit-user-guide/ материал, который нужно вводить в единичном тесте, должен работать нормально.CDI-Unit @Produces не работает

Моя установка:

@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 исключениями:

Exception 0: org.jboss.weld .exceptions.DeploymentException: WELD-001408: Невыполненные зависимости для типа Logger с квалификаторами @Default в точке впрыска [BackedAnnotatedField] @Inject private at.fhhagenberg.unitTesting.beans.SurveyBean.log ...

Это означает, что CdiRunner пытается построить мой SurveyBean и вставить регистратор, но он не может найти объект для инъекции, хотя я его специально создаю в базовом классе (то же, что и для EntityManager).

Кто-нибудь знает, как это исправить?

PS: теги не было разрешено добавить: КДИ-блок, jglue

ответ

2

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

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

+0

Звучит правильно, проверит этот вечер. Благодарю. – Thomas

Смежные вопросы