首页 文章

CDI:在使用Arquillian进行集成测试期间未在EJB项目中使用的beans.xml

提问于
浏览
2

我正在尝试使用显式CDI创建Java EE 7项目 . 该项目由Maven打包为ejb项目 .

尽管Java EE 7不再需要 beans.xml ,但我有一个这样的文件,位于 src/main/resources/META-INF/beans.xml 下,因为我想使用 @Alternatives 进行测试 .

更确切地说,我想在集成测试期间使用H2内存数据库(使用Arquillian和Weld),但对于非本地环境来说,这是一个很好的'postgres .

我的问题:

似乎忽略了 beans.xml 文件 . 测试:

  • 当我删除其中一个 @Produces EntityManager 的类时,它按预期工作 .

  • 当我有两个类,但只有一个注释 @Alternative 时,它使用另一个,无论 beans.xml 是什么 .

  • 当我有两个带有 @Alternative 注释的类时,它失败了

org.jboss.weld.exceptions.DeploymentException:WELD-001408在注入点[[field] @Inject private arquillian.ArquillianTestAbstract.em]中带有限定符[@Default]的[EntityManager]类型的不满意依赖项

我有点期待 beans.xml 在错误的地方或某事,但我搜索得很远(包括在this related question on SO),我找不到我的错误 .

一些文件:

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.mystuff</groupId>
        <artifactId>myparent</artifactId>
        <version>${project-version}</version>
    </parent>
    <artifactId>myproject</artifactId>
    <packaging>ejb</packaging>

(snip - various dependencies)       

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-ejb-plugin</artifactId>
                    <version>${ejb-plugin-version}</version>
                    <configuration>
                        <ejbVersion>${ejb-version}</ejbVersion>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>${surefire-plugin-version}</version>
                    <configuration>
                        <argLine>-Dfile.encoding=UTF-8</argLine>
                        <forkCount>1C</forkCount>
                        <redirectTestOutputToFile>false</redirectTestOutputToFile>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>  
    </build>

</project>

src/main/resources/META-INF/beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       bean-discovery-mode="all" version="1.1"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd">

    <alternatives>
        <class>persistence.TestDatabaseProducer</class>
    </alternatives>

</beans>

src/main/java/persistence/DatabaseProducerImpl.java:

@Singleton
@Alternative
public class DatabaseProducerImpl implements DatabaseProducer {

    @Produces
    @MyDatabase
    @Override
    public EntityManager createEntityManager() {
        return Persistence.createEntityManagerFactory("primary").createEntityManager();
    }

}

src/main/java/persistence/TestDatabaseProducer.java:

@Singleton
@Alternative
public class TestDatabaseProducer implements DatabaseProducer {

    @Produces
    @InternalDatabase
    @Override
    public EntityManager createEntityManager() {
        return Persistence.createEntityManagerFactory("internal").createEntityManager();
    }

}

1 回答

  • 0

    最后,我正在寻找错误的方向 . beans.xml 文件没有任何问题,只是在测试期间没有考虑到它 .

    This was specific to the testing on Weld through Arquillian ,由于Assets打包并发送到嵌入式容器的方式 .

    Arquillian测试的标准做法鼓励使用ShrinkWrap创建部署在Weld上的 JavaArchive ,如果您不要求,ShrinkWrap不会出现 beans.xml .

    这段代码解决了这个问题:(具体来说, .addAsManifestResource() 调用)

    @Deployment
    public static JavaArchive createDeployment() {
        final BeansDescriptor beansXml = Descriptors.create(BeansDescriptor.class);
    
        return ShrinkWrap.create(JavaArchive.class)
            .addPackages(true, "persistence")
            .addAsManifestResource(new StringAsset(beansXml.alternativeClass(TestDatabaseProducer.class).exportAsString()), beansXml.getDescriptorName());
    }
    

相关问题