第一次测试后Arquillian TomEE embedded javax.naming.ConfigurationException异常

第一次测试后Arquillian TomEE embedded javax.naming.ConfigurationException异常,java,integration-testing,jboss-arquillian,apache-tomee,Java,Integration Testing,Jboss Arquillian,Apache Tomee,我正在使用Arquillian和TomEE embedded来测试SpringLoggerBeanProducer,它使用CDI来构造一个logger对象,然后可以使用bean生成方法将其注入到Spring容器中。我遇到的问题是,可以生产5种类型的记录器。当我运行测试(每个测试生成一种类型的记录器)时,只有首先执行的测试成功,而由于javax.naming.ConfigurationException,所有后续测试都失败。 似乎只有第一个测试是在JEE服务器环境中执行的,而其他测试则不是 生产商

我正在使用Arquillian和TomEE embedded来测试SpringLoggerBeanProducer,它使用CDI来构造一个logger对象,然后可以使用bean生成方法将其注入到Spring容器中。我遇到的问题是,可以生产5种类型的记录器。当我运行测试(每个测试生成一种类型的记录器)时,只有首先执行的测试成功,而由于javax.naming.ConfigurationException,所有后续测试都失败。 似乎只有第一个测试是在JEE服务器环境中执行的,而其他测试则不是

生产商的代码如下:

package mypackage.monitoring.spring.logger.producer;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Set;

import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Annotated;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import mypackage.monitoring.shared.logger.Logger;
import mypackage.monitoring.shared.qualifier.Application;
import mypackage.monitoring.shared.qualifier.Business;
import mypackage.monitoring.shared.qualifier.Security;
import mypackage.monitoring.shared.qualifier.Technical;

@Configuration
public class SpringLoggerBeanProducer {

private BeanManager beanManager;

@org.springframework.context.annotation.Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Application
public Logger applicationLogger(org.springframework.beans.factory.InjectionPoint springIp) {
    return logger(springIp);
}

@org.springframework.context.annotation.Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Business
public Logger businessLogger(org.springframework.beans.factory.InjectionPoint springIp) {
    return logger(springIp);
}

@org.springframework.context.annotation.Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Security
public Logger securityLogger(org.springframework.beans.factory.InjectionPoint springIp) {
    return logger(springIp);
}

@org.springframework.context.annotation.Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Technical
public Logger technicalLogger(org.springframework.beans.factory.InjectionPoint springIp) {
    return logger(springIp);
}

private Logger logger(org.springframework.beans.factory.InjectionPoint springIp) {
    setBeanManager();
    Field field = springIp.getField();
    Annotation[] qualifiers = getFieldQualifiers(field);
    Bean<? extends Object> bean = getLoggerBean(qualifiers);
    return getInjectableLoggerReference(field, bean);
}

private Logger getInjectableLoggerReference(Field field, Bean<?> bean) {
    CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean);
    return (Logger) beanManager.getInjectableReference(getInjectionPoint(field), creationalContext);
}

private Bean<? extends Object> getLoggerBean(Annotation[] qualifiers) {
    Set<Bean<?>> beans = beanManager.getBeans(Logger.class, qualifiers);
    return beanManager.resolve(beans);
}

private Annotation[] getFieldQualifiers(Field field) {
    Annotation[] annotations = field.getAnnotations();

    Set<Annotation> qualifierSet = getQualifierSet(annotations);
    annotations = qualifierSet.toArray(new Annotation[0]);
    return annotations;
}

private void setBeanManager() {
    try {
        if (beanManager == null) {
            beanManager = InitialContext.doLookup("java:comp/BeanManager");
        }
    } catch (NamingException e) {
        throw new LoggerProducerException("BeanManager not found.", e);
    }
}

private Set<Annotation> getQualifierSet(Annotation[] annotations) {
    Set<Annotation> qualifierSet = new HashSet<Annotation>();
    for (Annotation annotation : annotations) {
        if (annotation.annotationType().isAnnotationPresent(javax.inject.Qualifier.class)) {
            qualifierSet.add(annotation);
        }
    }
    return qualifierSet;
}

private InjectionPoint getInjectionPoint(final Field member) {
    class GeneratedInjectionPoint implements InjectionPoint {

        @Override
        public boolean isTransient() {
            return Modifier.isTransient(member.getModifiers());
        }

        @Override
        public boolean isDelegate() {
            return false;
        }

        @Override
        public Type getType() {
            return member.getType();
        }

        @Override
        public Set<Annotation> getQualifiers() {
            Annotation[] annotations = member.getAnnotations();
            return getQualifierSet(annotations);
        }

        @Override
        public Member getMember() {
            return member;
        }

        @Override
        public Bean<?> getBean() {
            return null;
        }

        @Override
        public Annotated getAnnotated() {
            throw new UnsupportedOperationException("Method not implemented for " + this.getClass().getSimpleName() + ".class");
        }
    }

    return new GeneratedInjectionPoint();
}
}
我已将以下Maven依赖项添加到我的项目中:

    <!-- Arquillian junit testen -->
    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <version>1.1.9.FINAL</version>
        <scope>test</scope>
    </dependency>

    <!-- Arquillian adapter voor TomEE -->
    <dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>arquillian-tomee-embedded</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>

    <!-- Embedded container TomEE -->
    <dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>tomee-embedded</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>

org.jboss.arquillian.junit


应用程序的某些部分似乎弄乱了JNDI空间(ibm客户机jar?)。您可以尝试强制上下文工厂:org.apache.openejb.core.OpenEJBInitialContextFactory


旁注:也许还可以升级到tomee 7.0.3?

应用程序的某些部分似乎把tomee JNDI空间(ibm客户机jar?)搞砸了。您可以尝试强制上下文工厂:org.apache.openejb.core.OpenEJBInitialContextFactory


旁注:也可能升级到tomee 7.0.3?

这确实似乎是JNDI空间中的冲突,因为它在执行第一次测试后会发生变化。我仍然不清楚为什么会发生这种情况,但现在我确实有办法解决这个问题。这确实似乎是JNDI空间中的冲突,因为它在第一次测试执行后发生了变化。我仍然不清楚为什么会发生这种情况,但现在我确实有办法解决这个问题。
    <!-- Arquillian junit testen -->
    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <version>1.1.9.FINAL</version>
        <scope>test</scope>
    </dependency>

    <!-- Arquillian adapter voor TomEE -->
    <dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>arquillian-tomee-embedded</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>

    <!-- Embedded container TomEE -->
    <dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>tomee-embedded</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>