黄瓜CDI注入不适用于src / main / java中的bean

时间:2016-04-28 10:34:44

标签: java cucumber cdi cucumber-jvm cucumber-junit

我在maven项目中有一个JEE应用程序,使用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);
}

}

用户服务是一个具有一个简单实现的接口:

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-INFsrc/test/resources/META-INF中有空的beans.xml文件。

该步骤位于src/test/resources,服务界面及其在src/main/java中的实施。

这是JUnit-Test for it:

@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

我找到了this issue on github for cucumber。但解决方案对我不起作用。我已经在src/main/resources/META-INFsrc/test/resources/META-INF中有两个空的beans.xml文件。

似乎焊接容器仅为src/test创建上下文,src/main中的所有内容都不属于它。当我将服务接口和实现移动到src/test/java时,它可以工作......

有没有办法在src/main src/test中引用bean?

编辑:更正了服务界面的位置

1 个答案:

答案 0 :(得分:3)

假设您的步骤位于src/test/java且您的服务(界面)位于src/main/java而非src/(test|main)/resources(错字?),则您的设置应该有效。

请检查以下内容:

  1. 确保您的src/main/javasrc/test/java文件夹位于同一类路径中。
  2. 假设您使用符合CDI> 1.1标准的当前版本的Weld,请确保这两个文件夹均为explicit bean archives
  3. 确保您的beans.xml文件确实为空或具有bean-discovery-mode set to all
  4. 如果这也不起作用,请尝试为FakeUserService添加注释。