【问题标题】:Cucumber CDI injection does not work with beans in src/main/javaCucumber CDI 注入不适用于 src/main/java 中的 bean
【发布时间】:2016-04-28 10:34:44
【问题描述】:

我在一个使用 JUnit 和 Cucumber 测试我的代码的 maven 项目中有一个 JEE 应用程序。该应用程序在测试范围内使用带有weld-se 的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:

@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/test 引用src/main 中的bean?

编辑:服务接口的更正位置

【问题讨论】:

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


    【解决方案1】:

    假设您的步骤位于 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

    如果这也不起作用,请尝试注释您的 FakeUserService

    【讨论】:

    • 谢谢。这是 bean 发现:一个 beans.xml 位于 META-INF 中,而另一个位于 META_INF 中。有坏事发生的小错字... ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多