如何在集成测试阶段使用 Spring 嵌入式数据库初始化脚本



我可以使用Spring以编程方式创建和初始化嵌入式数据库:

@Before
public void setUp() {
    database = new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addScript("schema.sql")
            .addScript("init.sql")
            .build();
    ....
}

或通过弹簧配置:

<jdbc:initialize-database data-source="dataSource">
  <jdbc:script location="classpath:schema.sql"/>
  <jdbc:script location="classpath:init.sql"/>
</jdbc:initialize-database>

在这里,我的脚本schema.sqlinit.sql存储在目录src/test/resources中。 因此,如果使用嵌入式数据库的测试运行

mvn test

然后src/test/resources中的文件可用,一切都很好。

但是现在假设我想在集成测试中将嵌入式数据库与嵌入式Web服务器(Jetty或嵌入式Tomcat)一起使用,通过

mvn integration-test

现在在这个后期阶段,我想做一个几乎端到端的测试,命中 Web 服务的某些 url 返回预期的 HTTP 响应,假设嵌入式数据库中的某些数据。 但是在这一点上,部署在嵌入式Web服务器中的战争没有来自src/test/resources的文件,所以我的初始化脚本不存在,并且我收到错误

原因:java.io.FileNotFoundException:类路径资源 [schema.sql] 无法打开,因为它不存在

现在,如果我将脚本放入src/main/resources,一切都正常工作,但这些脚本仅用于填充嵌入式数据库进行测试,它们根本不属于 war 文件。 有谁知道如何设置集成测试,以便可以使用emedded数据库,而不会污染将要部署的实际战争文件?

我希望 Spring 的嵌入式数据库初始化可以使用文件以外的其他东西。 我想到了 JNDI,但这似乎需要用测试数据的资源定义污染 web.xml 文件,这将(再次)出现在可部署的战争中。 或者也许有使用货物的选择? 一些我不知道的春天的程序化技巧?

你应该能够做到这一点:

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="file:///${project.basedir}/src/test/resources/schema.sql"/>
    <jdbc:script location="file:///${project.basedir}/src/test/resources/init.sql"/>
</jdbc:initialize-database>

最新更新