модульные тесты, для которых требуется контейнер CDI, приводят к java .lang.IllegalStateException: невозможно получить доступ к CDI - PullRequest
0 голосов
/ 15 марта 2020

Я использую Weld для CDI.

Я пытаюсь написать модульный тест для службы "A", используя JUnit 5. Конструктор службы A:

@Inject
public A (B b) {this.b = b}

Конструктор класса B:

@ApplicationScoped
public class B{ 

private C c;
    public B() {
        c = CDI.current().select(C.class).get();
    }
}

Когда я пытаюсь смоделировать класс B во время модульных тестов, я получаю:

java .lang.IllegalStateException: Невозможно получить доступ к 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();
     }
}

1 Ответ

1 голос
/ 16 марта 2020

Я всегда так делаю (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.

...