WildFly/Arquillian集成测试报错:无法创建EventTestRunnerAdaptor实例
问题分析与解决方案
核心错误原因
你遇到的Could not create new instance of class org.jboss.arquillian.test.impl.EventTestRunnerAdaptor报错,主要是依赖版本冲突、容器选型错误、部署包配置不全这几个问题导致的,具体拆解:
- Arquillian组件版本不统一:BOM用了1.1.13.Final,但JUnit适配器用了1.9.1.Final,版本差异过大导致兼容性问题
- 混用JUnit和TestNG的Arquillian依赖:同时引入了
arquillian-testng-core和arquillian-junit-core,触发依赖冲突 - 容器选型矛盾:目标是WildFly,但引入了GlassFish的嵌入式容器依赖,环境不匹配
- 部署包缺少关键配置:没有包含持久化单元配置
persistence.xml,也没添加测试实体类MyClass - 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
相关产品推荐
相关产品推荐

