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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:24:55