Как запустить сварную шов в тесте JUnit

У меня есть проект Maven для модульных тестов и я хотел бы использовать CDI. Я поместил зависимость сварки в pom.xml следующим образом:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
</dependency>
<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>1.1.8.Final</version>
</dependency>
<dependency>
    <groupId>javax.enterprise</groupId>
    <artifactId>cdi-api</artifactId>
    <version>1.0-SP3</version>
</dependency>

Я запускаю сварку в тестовом центре JUnit:

public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {
   private final Class klass;
   private final Weld weld;
   private final WeldContainer container;

   public WeldJUnit4Runner(final Class klass) throws InitializationError {
       super(klass);
       this.klass = klass;
       this.weld = new Weld();
       this.container = weld.initialize();
   }

   @Override
   protected Object createTest() throws Exception {
       final Object test = container.instance().select(klass).get();

       return test;
   }
}

И модульный тест, который использует этот бегун. Тест вводит bean-объект приложения. Проблема в том, что сварка не может быть инициализирована из-за "неудовлетворенной зависимости" от единственной точки впрыска, как если бы мой объектный компонент был полностью неизвестен для сварки. Но этот компонент находится в src/test/java/... с моим тестом (но в другом пакете Java).

У меня есть пустой beans.xml в src/test/resources.

Я заметил, что сварка выдает предупреждения при запуске, но я не думаю, что это является причиной моей проблемы:

604 [main] WARN org.jboss.weld.interceptor.util.InterceptionTypeRegistry - Class 'javax.ejb.PostActivate' not found, interception based on it is not enabled
605 [main] WARN org.jboss.weld.interceptor.util.InterceptionTypeRegistry - Class 'javax.ejb.PrePassivate' not found, interception based on it is not enabled

Может ли кто-нибудь помочь мне с этим?

3 ответа

Посмотрите на CDI-Unit. Это производит Runner для тестовых классов JUnit:

@RunWith(CdiRunner.class) // Runs the test with CDI-Unit
class MyTest {
    @Inject
    Something something; // This will be injected before the tests are run!

    ...
}

Источник: руководство пользователя CDI-Unit.

CDI-Unit также регистрирует предупреждения ниже, но, несмотря на это, он работает хорошо:

WARN (InterceptionTypeRegistry.java) - WELD-001700: Interceptor annotation class javax.ejb.PostActivate not found, interception based on it is not enabled
WARN (InterceptionTypeRegistry.java) - WELD-001700: Interceptor annotation class javax.ejb.PrePassivate not found, interception based on it is not enabled

Несколько вещей, на которые стоит обратить внимание: контейнер Weld SE для Arquillian или модуль DeltaSpike CdiCtrl

Добавьте следующее beans.xml к src/test/resources/META-INF каталог:

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    version="1.1" bean-discovery-mode="all">
</beans>

Причина предупреждений: занятия javax.ejb.PostActivate а также javax.ejb.PrePassivate не были найдены. Вам не хватает зависимости.

Добавьте эту зависимость в ваш pom.xml:

<dependency>
    <groupId>javax.ejb</groupId>
    <artifactId>javax.ejb-api</artifactId>
    <version>3.2</version>
</dependency>

С уважением.

Другие вопросы по тегам