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