当前位置: 首页 > 知识库问答 >
问题:

在使用Arquillian进行集成测试期间,EJB项目中不使用cdi:beans.xml

常俊侠
2023-03-14
  • 当我删除@生成EntityManager的一个类时,它会按预期工作。
  • 当我有两个类,但只有一个注释的@alternative时,它使用另一个,而不管beans.xml怎么说。
  • 当两个类都带有@alternative注释时,
  • 失败

deploymentException:WELD-001408类型[EntityManager]在注入点带有限定符[@Default]的不满足依赖项[[field]@Inject private Arquillian.ArquillianTestAbstract.em]

我希望beans.xml出现在错误的位置或其他地方,但我搜索了很多地方(包括SO上的这个相关问题),但我找不到我的错误。

<?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>
<?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.j

@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个答案

程禄
2023-03-14

最后,我找错了方向。beans.xml文件没有任何问题,只是在测试过程中没有考虑到它。

这是通过Arquillian对Weld的测试所特有的,也是由于资产打包和发送到嵌入式容器的方式所致。

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

@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());
} 
 类似资料:
  • 我经常使用依赖于几个(比如5-10个)其他EJB/CDI bean的EJB,并且许多方法只使用它们的一个子集。集成测试(我们将Arquillian与嵌入式GlassFish4.0容器一起使用)它们是痛苦的,因为我仍然必须为整个类图提供依赖关系。我一个接一个地将类添加到ShrinkWrap归档中,因为添加整个包会创建更多的依赖关系,我不想添加所有类,因为这会显著增加完成一个测试所需的时间。我也不希望

  • 我试图让测试(junit和robolectric)在Android项目中工作,但完全卡住了。我的主要问题是,我用gradle发现的所有测试都以某种方式拉入了java插件,然后我得到了这个错误: 我目前看到的唯一出路是分裂成测试和应用程序项目--但我想避免这种情况。任何例子/提示将非常感谢! 在官方文档中没有提到单元测试--只提到仪器测试--但我希望单元测试能快速得到结果。

  • 我正在尝试将Spring Boot应用程序的一些集成测试从迁移到。目前,测试使用的是 当测试运行时,被配置为使用与服务器运行时相同的基本URL和(随机选择的)端口。 在我的一个测试中,我登录并保存authorization-response头值,以便在后续的API调用中使用。我试着将它迁移到,就像这样 但是当我像这样创建实例时,它没有配置为使用与应用程序相同的端口。 我尝试使用的依赖注入实例 这确

  • Gradle4.6增加了对JUnit5的支持。 只要我没有用于例如集成测试的另一个sourceset,这对我是有效的:我不知道如何在我的集成测试中启用。 我所能做的是让任务与新的JUnit5支持一起工作,但我的任务使用JUnit5控制台并从命令行运行测试。最后,我在gradle中放弃对JUnit5的支持,并回滚到使用JUnit5控制台进行两个测试。 除了之外,如何在其他任务上启用Gradle4.6

  • 我创建了一个NetBeans企业应用程序,它由包装ejb(jar)项目和web(war)项目的ear组成。 我的web项目中有一个servlet,我想在其中使用ejb项目中的一个ejb。

  • 第一:是的,我读到了https://dropwizard.github.io/dropwizard/manual/testing.html 我想做一些集成测试,以及为什么我必须启动整个应用程序。现在的问题是,我有一些与“外部世界”的接口,如DB或一个内部的Rest-Client,它与一个远程应用程序交谈。我想用嘲弄来嘲笑他们。通常这没问题。 现在我的问题是:如何使用模拟数据库和模拟客户端启动整个应