You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WildFly/Arquillian集成测试报错:无法创建EventTestRunnerAdaptor实例

问题分析与解决方案

核心错误原因

你遇到的Could not create new instance of class org.jboss.arquillian.test.impl.EventTestRunnerAdaptor报错,主要是依赖版本冲突、容器选型错误、部署包配置不全这几个问题导致的,具体拆解:

  1. Arquillian组件版本不统一:BOM用了1.1.13.Final,但JUnit适配器用了1.9.1.Final,版本差异过大导致兼容性问题
  2. 混用JUnit和TestNG的Arquillian依赖:同时引入了arquillian-testng-core和arquillian-junit-core,触发依赖冲突
  3. 容器选型矛盾:目标是WildFly,但引入了GlassFish的嵌入式容器依赖,环境不匹配
  4. 部署包缺少关键配置:没有包含持久化单元配置persistence.xml,也没添加测试实体类MyClass
  5. JUnit注解混用:用了JUnit5的@BeforeAll但却用JUnit4的@RunWith(Arquillian.class),注解不兼容

具体修复步骤

1. 修正pom.xml依赖

删除冲突、错误的依赖,统一Arquillian版本,换成WildFly容器适配包:

<!-- 统一Arquillian版本的BOM -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.arquillian</groupId>
            <artifactId>arquillian-bom</artifactId>
            <version>1.7.0.Final</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- JUnit4 核心依赖 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>

    <!-- Arquillian JUnit4 适配器 -->
    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- WildFly 嵌入式容器(如果用本地WildFly实例,换成managed版本) -->
    <dependency>
        <groupId>org.wildfly.arquillian</groupId>
        <artifactId>wildfly-arquillian-container-embedded</artifactId>
        <version>3.0.1.Final</version>
        <scope>test</scope>
    </dependency>

    <!-- WildFly 嵌入式核心包 -->
    <dependency>
        <groupId>org.wildfly</groupId>
        <artifactId>wildfly-embedded</artifactId>
        <version>27.0.1.Final</version>
        <scope>test</scope>
    </dependency>

    <!-- JPA API 依赖 -->
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
        <version>2.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

注:如果不需要嵌入式WildFly,可将wildfly-arquillian-container-embedded换成wildfly-arquillian-container-managed,并配置本地WildFly路径。

2. 完善部署包配置

修改createTestArchive()方法,添加测试实体类、persistence.xml,并确保beans.xml路径正确:

@RunWith(Arquillian.class)
public class MyFirstIT{

    @Deployment
    public static JavaArchive createTestArchive() {
        return ShrinkWrap.create(JavaArchive.class, "test.jar")
            // 添加测试需要的实体类和业务类
            .addClasses(MyClass.class)
            // 添加JPA持久化配置
            .addAsManifestResource("META-INF/persistence.xml", "persistence.xml")
            // 添加CDI配置
            .addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"));
    }

    // ... 其他代码
}

同时在src/test/resources/META-INF下创建persistence.xml,配置嵌入式数据源(比如H2内存库):

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
             version="2.2">
    <persistence-unit name="testPU" transaction-type="JTA">
        <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

3. 修正测试代码注解

把JUnit5的@BeforeAll换成JUnit4的@BeforeClass:

@BeforeClass
public static void setup() {
    // 初始化逻辑
}

4. 测试后数据清理方案

推荐两种方式:

  • 方式1:利用JTA事务自动回滚:给测试方法添加@Transactional注解,测试结束后自动回滚数据:
    @Test
    @Transactional
    public void createInstanceTest() {
        // 测试逻辑
        var myClass = myEntityManager.find(MyClass.class, "1");
    }
    
  • 方式2:手动清理:在@After方法中删除测试数据:
    @After
    public void cleanUp() {
        MyClass myClass = myEntityManager.find(MyClass.class, "1");
        if (myClass != null) {
            myEntityManager.remove(myClass);
            myEntityManager.flush();
        }
    }
    

内容的提问来源于stack exchange,提问作者OhJohnny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:37:09