注释由生产者注入的变量

时间:2015-11-10 15:12:08

标签: java dependency-injection annotations cdi

根据我的理解,应该可以使用生产者在Java中使用CDI注入任何类型的变量。为了测试这个,我创建了一个小单元测试。

@RunWith(CdiRunner.class)
public class Test {

    @Inject
    @AnIntProducer
    int i; // Variable to be injected

    @org.junit.Test
    public void test() throws Exception {
        System.out.println(i);
    }
}

然后我继续创建注释和制作人:

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface AnIntProducer {
}

public class TestProducer {

    @Produces
    @AnIntProducer
    public int i() {
        return 503;
    }
}

当我运行测试时,我认为它应该打印503,但我得到:

org.jboss.weld.exceptions.DeploymentException:
WELD-001408: Unsatisfied dependencies for type int with qualifiers @AnIntProducer
  at injection point [UnbackedAnnotatedField] @Inject Test.i
  at Test.i(Test.java:0)  

不知怎的,似乎CdiRunner找不到制作人,我真的不知道为什么。我的设置有问题,或者我误解了注射是如何工作的?

1 个答案:

答案 0 :(得分:2)

CdiRunner检查测试类的导入,并根据引用的类构建一个小型部署。当您运行测试时,您已定义的生产者不会包含在该小型部署中。

要在测试部署中包含其他类和包,您需要将@AdditionalClasses或@AdditionalPackages添加到测试类中。

示例:

@RunWith(CdiRunner.class)
@AdditionalClasses(TestProducer.class)
public class Test {

您还可以使用注释来声明应该包含在测试部署的beans.xml中的内容,这样您就可以激活替代方案,拦截器和装饰器。