Внедрение CDI Cucumber не работает с bean-компонентами в src/main/java

У меня есть приложение JEE в проекте maven, использующем JUnit и Cucumber для тестирования моего кода. Приложение использует CDI со сваркой в ​​области тестирования.

Я создал простой файл функций src/test/resources/specification/first.feature

Scenario: Identified user
  Given I am user A

Затем я создал соответствующий шаг огурца:

public class FirstSteps {

@Inject
UserService userService;

@Given("^I am user A$")
public void i_am_user_A() throws Throwable {
    User user = User.new().withName("user A").create();
    assertThat(userService.getActualUser()).isEqualTo(user);
}

}

User Service — это интерфейс с одной тривиальной реализацией:

public interface UserService {
    User getActualUser();
}

public class FakeUserService implements UserService {

    @Override
    public User getActualUser() {
        return User.new().withName("user A").create();
    }

}

В src/main/resources/META-INF и src/test/resources/META-INF есть пустые файлы beans.xml.

Шаг находится в src/test/resources, интерфейс сервиса и его реализация в src/main/java.

И вот JUnit-Test для него:

@RunWith(Cucumber.class)
@CucumberOptions(
    features = {"classpath:specifikation"},
    glue = {"mypackage"})
public final class CucumberTests {
}

Шаг найден огурцом и выполняется. Но CDI не работает:

Exception in thread "main" org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type UserService with qualifiers @Default at injection point [BackedAnnotatedField] @Inject mypackage.FirstSteps.userService

Я нашел эту проблему на github для огурца. Но решение не работает для меня. У меня уже есть два пустых файла beans.xml в src/main/resources/META-INF и src/test/resources/META-INF.

Похоже, что контейнер сварки создает контекст только для src/test, и все, что находится в src/main, ему не принадлежит. Когда я перемещаю интерфейс службы и реализацию на src/test/java, он работает...

Есть ли способ сослаться на bean-компоненты в src/main из src/test?

РЕДАКТИРОВАТЬ: исправлено расположение интерфейса службы


person Marc von Renteln    schedule 28.04.2016    source источник


Ответы (1)


Предполагая, что ваш шаг находится в src/test/java, а ваш сервис (интерфейс) находится в src/main/java, а не в src/(test|main)/resources (опечатка?), ваша установка должна работать.

Возможно, проверьте следующее:

  1. Убедитесь, что ваши папки src/main/java и src/test/java находятся в одном пути к классам.
  2. Предполагая, что вы используете текущую версию Weld, совместимую с CDI > 1.1, убедитесь, что обе папки явные архивы компонентов.
  3. Убедитесь, что ваши файлы beans.xml буквально пусты или для bean-discovery-mode задано значение all .

Если и это не сработает, попробуйте аннотировать свой файл FakeUserService.

person sven-torben    schedule 28.04.2016
comment
Спасибо. Это был bean discovery: один beans.xml лежал в META-INF, а другой в META_INF. Небольшая опечатка с плохими вещами... ;) - person Marc von Renteln; 10.05.2016