У меня есть приложение 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
?
РЕДАКТИРОВАТЬ: исправлено расположение интерфейса службы