需要 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。