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

Ray*_*oal 12 spring integration-testing embedded-database

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

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

或通过Spring配置:

<jdbc:initialize-database data-source="dataSource">
  <jdbc:script location="classpath:schema.sql"/>
  <jdbc:script location="classpath:init.sql"/>
</jdbc:initialize-database>
Run Code Online (Sandbox Code Playgroud)

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

mvn test
Run Code Online (Sandbox Code Playgroud)

然后存在的文件src/test/resources可用,一切都很好.

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

mvn integration-test
Run Code Online (Sandbox Code Playgroud)

现在处于这个后期阶段,我想做一个几乎是端到端的测试,即在嵌入式数据库中存在某些数据时,为Web服务命中某些URL会返回预期的HTTP响应.但此时,嵌入式Web服务器中部署的战争没有文件,src/test/resources因此我的初始化脚本不存在,我收到错误

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

现在,如果我把脚本放进去,一切都会有效,src/main/resources但这些脚本只是用于填充嵌入式数据库进行测试,而且根本不属于 war文件.有没有人知道如何设置集成测试,以便可以使用一个修剪过的数据库,而不会污染将要部署的实际war文件?

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

Kev*_*vin 5

你应该能够做到这一点:

<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>
Run Code Online (Sandbox Code Playgroud)