Cucumber CDI 注入不适用于 src/main/java 中的 bean
Cucumber CDI injection does not work with beans in src/main/java
我在 Maven 项目中有一个 JEE 应用程序,使用 JUnit 和 Cucumber 来测试我的代码。该应用程序在测试范围内使用 CDI 和 weld-se。
我创建了一个简单的特征文件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-INF
和 src/test/resources/META-INF
中有空 beans.xml 个文件。
步骤位于src/test/resources
,服务接口及其实现在src/main/java
。
这是它的 JUnit 测试:
@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-INF
和 src/test/resources/META-INF
.
中有两个空的 beans.xml 文件
似乎 weld 容器只为 src/test
创建了一个上下文,而 src/main
中的所有内容都不属于它。当我将服务接口和实现移动到 src/test/java
时,它起作用了...
有没有办法从 src/test
引用 src/main
中的 bean?
编辑:更正了服务接口的位置
假设您的步骤位于 src/test/java
并且您的服务(界面)位于 src/main/java
而不是 src/(test|main)/resources
(打字错误?),您的设置应该有效。
也许检查以下内容:
- 确保您的
src/main/java
和 src/test/java
文件夹位于相同的类路径中。
- 假设您使用的是符合 CDI >1.1 标准的当前版本的 Weld,请确保两个文件夹都是 explicit bean archives。
- 确保您的 beans.xml 文件完全是空的或有 bean-discovery-mode set to all.
如果这也不起作用,请尝试注释您的 FakeUserService
。
我在 Maven 项目中有一个 JEE 应用程序,使用 JUnit 和 Cucumber 来测试我的代码。该应用程序在测试范围内使用 CDI 和 weld-se。
我创建了一个简单的特征文件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-INF
和 src/test/resources/META-INF
中有空 beans.xml 个文件。
步骤位于src/test/resources
,服务接口及其实现在src/main/java
。
这是它的 JUnit 测试:
@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-INF
和 src/test/resources/META-INF
.
似乎 weld 容器只为 src/test
创建了一个上下文,而 src/main
中的所有内容都不属于它。当我将服务接口和实现移动到 src/test/java
时,它起作用了...
有没有办法从 src/test
引用 src/main
中的 bean?
编辑:更正了服务接口的位置
假设您的步骤位于 src/test/java
并且您的服务(界面)位于 src/main/java
而不是 src/(test|main)/resources
(打字错误?),您的设置应该有效。
也许检查以下内容:
- 确保您的
src/main/java
和src/test/java
文件夹位于相同的类路径中。 - 假设您使用的是符合 CDI >1.1 标准的当前版本的 Weld,请确保两个文件夹都是 explicit bean archives。
- 确保您的 beans.xml 文件完全是空的或有 bean-discovery-mode set to all.
如果这也不起作用,请尝试注释您的 FakeUserService
。