Maven: javax.enterprise.context.ContextNotActiveException при выполнении тестов с openejb

Я создал несколько модульных и интеграционных тестов для моего проекта Java-ee с помощью OpenEjb и Junit со встроенным контейнером. Тесты в Eclipse работают нормально, бины (CDI/EJB) вводятся и работают нормально. Но когда я запускаю тесты с maven и surefire, я получаю следующую ошибку:

WARNING: Handling the following exception
Throwable occurred: javax.enterprise.context.ContextNotActiveException: WebBeans context with scope type annotation @RequestScoped does not exist within current thread
at org.apache.webbeans.container.BeanManagerImpl.getContext(BeanManagerImpl.java:330)
at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.getContextualInstance(NormalScopedBeanInterceptorHandler.java:88)
at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.get(NormalScopedBeanInterceptorHandler.java:70)
at org.apache.webbeans.conversation.ConversationImpl$$OwbNormalScopeProxy0.isTransient(org/apache/webbeans/conversation/ConversationImpl.java)
at org.apache.wicket.cdi.ConversationPropagator.onUrlMapped(ConversationPropagator.java:322)
at org.apache.wicket.request.cycle.RequestCycleListenerCollection$9.notify(RequestCycleListenerCollection.java:208)

Что может быть не так? Это похоже на проблему с classpath или что-то в этом роде, но явное добавление openwebbeans-spi и openwebbeans-impl не сработало.

Я использую следующие строки в тестовом классе:

@ClassRule
public static final EJBContainerRule CONTAINER_RULE = new EJBContainerRule();

@Rule
public final InjectRule rule = new InjectRule(this, CONTAINER_RULE);

И у меня есть следующие openejb-junit.properties:

openejb.validation.output.level=VERBOSE
openejb.deployments.classpath.include=.*org.mine.*
openejb.descriptors.output=true
openejb.ejbcontainer.close=single-jvm
java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory

Спасибо за любую помощь.

Привет, Хулс.

1 ответ

Я не знаю точно, как вы создаете / разрешаете ваши bean-компоненты, но это похоже на проблему, с которой мы столкнулись в нашей тестовой настройке. Когда вы разрешаете свой компонент вручную, используя менеджер компонентов, он не связан с контекстом создания, и вам придется делать это вручную.

Однажды я написал небольшой метод для извлечения bean-компонентов с использованием CDI в нашем тестовом коде:

public <T> T getCDIBean(Class<T> type, AnnotationLiteral<?>... qualifierAnnotations) {
    Set<Bean<?>> beans = getBeanManager().getBeans(type, qualifierAnnotations);

    Bean<?> bean;
    if (beans.size() == 1) {
        bean = beans.iterator().next();
    } else {
        bean = getBeanManager().resolve(beans);
    }

    CreationalContext<?> context = getBeanManager().createCreationalContext(bean);
    return (T) getBeanManager().getReference(bean, type, context);
}
Другие вопросы по тегам