Java CDI @Inject抛出NullPointerException

时间:2014-06-02 16:37:46

标签: java nullpointerexception cdi

我正在official documentation之后测试Java 7 CDI功能,但是当我尝试访问NullPointerException对象时,我得到greeting。该项目如果是Jar Maven的话。

这是Greeting

package greetings;

import javax.enterprise.inject.Default;
@Default
public class Greeting {
    public void  greet(String name) {
        System.out.println("Hello, " + name + ".");
    }
}

这是我注入bean的测试类

package greetings;

import static org.junit.Assert.assertTrue;
import javax.inject.Inject;
import org.junit.Test;

public class Tester {

    @Inject Greeting greeting;

    @Test
    public void greet()
    {
        greeting.greet("Mark");
        assertTrue(greeting!=null);
    }
}

我还在beans.xml文件夹

中添加了src/main/resources/META-INF文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

</beans>

当我运行测试时,我会在NullPointerException类的标记行中获得Tester

您如何看待这个问题?我浏览了很多文档,但似乎这个问题是通过添加已经在类路径中的beans.xml来解决的。

3 个答案:

答案 0 :(得分:3)

您可以在jUnit测试中使用CDI。检查一下:http://jglue.org/cdi-unit/

答案 1 :(得分:1)

你可以使用Arquillian进行单元测试CDI

http://arquillian.org/

答案 2 :(得分:1)

注入仅适用于托管bean(以及一些其他对象,如servlet)。测试类由JUnit实例化,而不是由CDI容器实例化,因此注入不是开箱即用的。

您需要一个特殊的JUnit运行器,它将依赖项注入实例化的测试类 - 例如Pax Exam in CDI mode