Я тестирую функции 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
, который уже находится в пути к классам.
Вы можете использовать CDI в тесте jUnit. Проверьте это: http://jglue.org/cdi-unit/
Инъекция работает только для управляемых компонентов (и нескольких других объектов, таких как сервлеты). Тестовые классы получают экземпляр JUnit, а не контейнер CDI, поэтому инъекция не работает из коробки.
Вам нужен специальный JUnit runner, который вводит зависимости в экземплярный тестовый класс - например, Pax Exam в режиме CDI.
Вы можете использовать Arquillian для модульного теста CDI