CDI-Unit @Produces 不工作
Posted
技术标签:
【中文标题】CDI-Unit @Produces 不工作【英文标题】:CDI-Unit @Produces not working 【发布时间】:2016-01-03 19:42:17 【问题描述】:首先,我在 Google 上进行了密集搜索,根据 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 并注入记录器,但它找不到要注入的对象,尽管我专门在基类中生成它(EntityManager 也是如此)。
有人知道如何解决这个问题吗?
PS:我不允许添加的标签:cdi-unit、jglue
【问题讨论】:
【参考方案1】:您需要将生产者方法放入与 DBUnitBaseTest 不同的类中。此类是抽象的,不能用作 CDI 生产者。 em 和 logger 的生产者方法。
这是因为具有生产者方法/字段的类本身必须是 CDI bean - 该类的实例由 CDI 在调用生产者方法之前创建。 CDI 不能从抽象类创建 bean。另外,@Producer
注解不会被继承,因此SurveyBeanTest
继承的方法不会被视为生产者。
【讨论】:
以上是关于CDI-Unit @Produces 不工作的主要内容,如果未能解决你的问题,请参考以下文章
RestEASY + Jboss 7.x - 当 Accepts 与 @Produces 值不匹配时,您可以默认使用第一个 @Path 吗?
获取在 ExceptionMapper 中抛出异常的方法的 @Produces 注释
SpringMVC注解@RequestMapping之produces属性导致的406错误