需要 CDI 容器的单元测试导致 java.lang.IllegalStateException:无法访问 CDI
unit tests which need CDI container result in java.lang.IllegalStateException: Unable to access CDI
我正在为 CDI 使用 Weld。
我正在尝试使用 JUnit 5 为服务 "A" 编写单元测试。
服务A的构造函数是:
@Inject
public A (B b) {this.b = b}
Class B构造函数为:
@ApplicationScoped
public class B{
private C c;
public B() {
c = CDI.current().select(C.class).get();
}
}
当我在单元测试期间尝试模拟 Class B 时,我得到:
java.lang.IllegalStateException: Unable to access CDI
因为在单元测试期间没有合适的 CDI 容器。
如何解决这个问题? Mockito 有什么用吗? (假设替换 CDI.current() 不是一个选项)
这是测试代码的样子:
public class ATest {
private A a;
@WeldSetup
private WeldInitiator weld = WeldInitiator.from(A.class)
.addBeans(createBBean()).build();
private Bean<?> createBBean() {
return MockBean.builder()
.types(B.class)
.scope(ApplicationScoped.class)
.creating(new B())
.build();
}
@BeforeEach
void setUpClass() {
a = weld.select(A.class).get();
}
}
我总是这样做(CDI 2.0 及更高版本):
private SeContainer container;
@BeforeEach
private void startContainer() {
SeContainerInitializer initializer = SeContainerInitializer.newInstance();
// add what you want, disable discovery, whatever
this.container = initializer.initialize();
}
@AfterEach
private void stopContainer() {
if (this.container != null) {
this.container.close();
}
}
然后任何 @Test
都可以访问 CDI。
我正在为 CDI 使用 Weld。
我正在尝试使用 JUnit 5 为服务 "A" 编写单元测试。 服务A的构造函数是:
@Inject
public A (B b) {this.b = b}
Class B构造函数为:
@ApplicationScoped
public class B{
private C c;
public B() {
c = CDI.current().select(C.class).get();
}
}
当我在单元测试期间尝试模拟 Class B 时,我得到:
java.lang.IllegalStateException: Unable to access CDI
因为在单元测试期间没有合适的 CDI 容器。
如何解决这个问题? Mockito 有什么用吗? (假设替换 CDI.current() 不是一个选项)
这是测试代码的样子:
public class ATest {
private A a;
@WeldSetup
private WeldInitiator weld = WeldInitiator.from(A.class)
.addBeans(createBBean()).build();
private Bean<?> createBBean() {
return MockBean.builder()
.types(B.class)
.scope(ApplicationScoped.class)
.creating(new B())
.build();
}
@BeforeEach
void setUpClass() {
a = weld.select(A.class).get();
}
}
我总是这样做(CDI 2.0 及更高版本):
private SeContainer container;
@BeforeEach
private void startContainer() {
SeContainerInitializer initializer = SeContainerInitializer.newInstance();
// add what you want, disable discovery, whatever
this.container = initializer.initialize();
}
@AfterEach
private void stopContainer() {
if (this.container != null) {
this.container.close();
}
}
然后任何 @Test
都可以访问 CDI。