我可以使用Spring以编程方式创建和初始化嵌入式数据库:
@Before
public void setUp() {
database = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("schema.sql")
.addScript("init.sql")
.build();
....
}
或通过Spring配置:
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:schema.sql"/>
<jdbc:script location="classpath:init.sql"/>
</jdbc:initialize-database>
此处我的脚本schema.sql
和init.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
中,现在将工作,但这些脚本仅用于填充测试的嵌入式数据库,但它们不会< em>属于在war文件中。有没有人知道如何设置集成测试,以便可以使用一个修剪过的数据库,而不会污染将要部署的实际war文件?
我希望Spring的嵌入式数据库初始化可以使用除文件之外的其他东西。我想到了JNDI,但这似乎要求使用测试数据的资源定义来污染web.xml文件,该资源定义将(再次)出现在可部署的战争中。或者也许有使用货物的选择?我不知道Spring的一些程序化技巧?
答案 0 :(得分: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>