Jakarta ee Maven:javax.enterprise.context.ContextNotActivieException在使用openejb运行测试时

Jakarta ee Maven:javax.enterprise.context.ContextNotActivieException在使用openejb运行测试时,jakarta-ee,junit,cdi,openejb,openwebbeans,Jakarta Ee,Junit,Cdi,Openejb,Openwebbeans,在OpenEjb和Junit以及嵌入式容器的帮助下,我为我的JavaEE项目创建了一些单元测试和集成测试。测试在Eclipse中运行良好,bean(CDI/EJB)被注入,工作正常。但是当我使用maven和surefire开始测试时,我得到以下错误: WARNING: Handling the following exception Throwable occurred: javax.enterprise.context.ContextNotActiveException: WebBeans c

在OpenEjb和Junit以及嵌入式容器的帮助下,我为我的JavaEE项目创建了一些单元测试和集成测试。测试在Eclipse中运行良好,bean(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)
有什么不对劲吗?这看起来像是一个类路径问题,但显式添加openwebbeans spi和openwebbeans impl不起作用

我在testclass中使用以下行:

@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
谢谢你的帮助

您好,
Huls.

我不知道您是如何创建/解决bean的,但这听起来像是我们在测试设置中遇到的类似问题。当您使用bean管理器手动解析bean时,它与创建上下文没有关联,您必须手动执行此操作

我曾经在测试代码中编写了一个使用CDI检索bean的小实用方法:

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);
}
public T getCDIBean(类类型,AnnotationLiteral…限定符Annotations){
套豆;
if(beans.size()==1){
bean=beans.iterator().next();
}否则{
bean=getBeanManager().resolve(bean);
}
CreationalContext=getBeanManager().createCreationalContext(bean);
return(T)getBeanManager().getReference(bean、类型、上下文);
}

我不知道您是如何创建/解决bean的,但这听起来像是我们在测试设置中遇到的类似问题。当您使用bean管理器手动解析bean时,它与创建上下文没有关联,您必须手动执行此操作

我曾经在测试代码中编写了一个使用CDI检索bean的小实用方法:

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);
}
public T getCDIBean(类类型,AnnotationLiteral…限定符Annotations){
套豆;
if(beans.size()==1){
bean=beans.iterator().next();
}否则{
bean=getBeanManager().resolve(bean);
}
CreationalContext=getBeanManager().createCreationalContext(bean);
return(T)getBeanManager().getReference(bean、类型、上下文);
}