使用spring-test-dbunit加载data.xml数据集失败,求排查建议
Spring Test DBUnit 数据集加载异常排查
我在搭建Java Spring应用的集成测试时,按照spring-test-dbunit官方文档配置后,已确认数据库表创建且schema验证通过,但测试中查询数据源时抛出以下异常:
java.lang.IllegalArgumentException: Unable to load dataset from"data.xml" using classcom.github.springtestdbunit.dataset.FlatXmlDataSetLoader
我推测是data.xml文件路径不对,但不清楚正确路径,已经尝试把文件放在测试类所在包(src/test/java/integration)和src/test/resources目录下,都没解决。附上相关代码配置,求排查建议:
测试类代码
@SpringJUnitConfig @ContextConfiguration @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DbUnitTestExecutionListener.class }) @SpringBootTest @DatabaseSetup("data.xml") @DatabaseTearDown("data.xml") public class SubscriptionQueryTest{ @Autowired private LearnerSubscriptionRepository learnerSubscriptionRepository; @Test public void testSubscriptionQuery() { assertNotNull(learnerSubscriptionRepository); } @Test public void testFindDistinctEmails() { long lCount = learnerSubscriptionRepository.count(); assertTrue(lCount > 0); ArrayList<String> learnerEmails = learnerSubscriptionRepository.findDistinctMails(); assertNotNull(learnerEmails); assertEquals(6, learnerEmails.size()); List<String> found = new ArrayList<>(); //check that all the results are unique values for (String email : learnerEmails ) { assertFalse(found.contains(email)); found.add(email); } } }
CrudRepository代码
public interface LearnerSubscriptionRepository extends CrudRepository<LearnerSubscription, Integer> { @Query("SELECT DISTINCT mail FROM LearnerSubscription") ArrayList<String> findDistinctMails(); }
实体类代码
@Entity public class LearnerSubscription { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", length = 100, nullable = false, unique = true) private int id; @Column(name = "sub", length = 100, nullable = false, unique = false) private String sub; @Column(name = "mail", length = 100, nullable = false, unique = false) private String mail; ... }
src/test/resources下的application.properties
jdbc.driverClassName=org.h2.Driver spring.datasource.url=jdbc:h2:mem:myDb;mode=mysql;DB_CLOSE_DELAY=-1;NON_KEYWORDS=KEY,VALUE spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=true spring.jpa.hibernate.use-new-id-generator-mappings=false
src/test/resources下的data.xml
<?xml version='1.0' encoding='UTF-8'?> <dataset> <learner_subscription id="330" mail="foo@bar.edu" opted_in="true" sub="foo039" subscription="6e8c478e-aabe-4789-ab22-8092e19c2dde" individual_emails="false"/> <learner_subscription id="331" mail="foo@bar.edu" opted_in="true" sub="foo039" subscription="890740d5-2edc-4843-9500-c5841da835d3" individual_emails="false"/> <learner_subscription id="332" mail="foo@bar.edu" opted_in="true" sub="foo039" subscription="23dc6e5e-26cf-447e-9f16-79cea544dc77" individual_emails="false"/> <learner_subscription id="333" mail="foo@bar.edu" opted_in="true" sub="foo039" subscription="57823ff6-e262-4201-8766-84cd17dfe116" individual_emails="false"/> <learner_subscription id="334" mail="foo@bar.edu" opted_in="true" sub="foo039" subscription="dfaeb775-dd7c-4f8e-a632-624df4bae041" individual_emails="false"/> <learner_subscription id="335" mail="foo@bar.edu" opted_in="true" sub="foo039" subscription="6b7ea99a-a9d2-4610-abb7-aef37eec4c26" individual_emails="false"/> </dataset>
排查建议
- 修正路径引用方式:如果
data.xml放在src/test/resources下,需要用classpath:前缀指定路径,修改注解:@DatabaseSetup("classpath:data.xml") @DatabaseTearDown("classpath:data.xml") - 确认资源文件是否被正确编译:执行
mvn test-compile后,查看target/test-classes目录下是否存在data.xml,如果缺失,检查Maven配置是否正确复制src/test/resources下的文件。 - 检查数据集与表结构匹配性:你的
data.xml中包含opted_in、subscription、individual_emails等属性,但实体类中没有对应字段,DBUnit默认会严格校验表结构,这会导致加载失败。要么给实体类添加这些字段,要么删除XML中多余的属性,或者配置DBUnit忽略多余列。 - 简化测试上下文配置:同时使用
@SpringJUnitConfig、@ContextConfiguration和@SpringBootTest可能存在上下文冲突,Spring Boot项目仅需@SpringBootTest即可自动配置测试上下文,尝试移除另外两个注解。 - 验证XML文件格式:检查
data.xml的语法是否正确,比如标签闭合、属性引号是否完整,语法错误也会导致加载失败。
内容的提问来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

