Java CDI @Inject создает исключение NullPointerException

1

Я тестирую функции Java 7 CDI после официальной документации, но при попытке доступа к greeting объекту я получаю NullPointerException. Проект, если Jar Maven один.

Это класс Greeting

package greetings;

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

Это тестовый класс, в который я вставляю компонент

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, который уже находится в пути к классам.

  • 1
    JUnit не работает напрямую с CDI.
Теги:
nullpointerexception
cdi

3 ответа

3
Лучший ответ

Вы можете использовать CDI в тесте jUnit. Проверьте это: http://jglue.org/cdi-unit/

  • 0
    Спасибо @Loc Ха, я попробовал CDI-Unit, и бин правильно введен. Я впервые работаю с CDI на Java, поэтому мне есть чему поучиться.
1

Инъекция работает только для управляемых компонентов (и нескольких других объектов, таких как сервлеты). Тестовые классы получают экземпляр JUnit, а не контейнер CDI, поэтому инъекция не работает из коробки.

Вам нужен специальный JUnit runner, который вводит зависимости в экземплярный тестовый класс - например, Pax Exam в режиме CDI.

1

Вы можете использовать Arquillian для модульного теста CDI

http://arquillian.org/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню