我可以使用 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 响应。但是此时,嵌入式网络服务器中部署的战争没有文件,src/test/resources
因此我的初始化脚本不存在,我得到了错误
原因:java.io.FileNotFoundException:类路径资源[schema.sql]无法打开,因为它不存在
现在,如果我将脚本放入其中,一切都会src/main/resources
正常工作,但这些脚本仅用于填充嵌入式数据库进行测试,它们根本不属于war 文件。有谁知道如何设置集成测试以便可以使用嵌入式数据库,而不会污染将要部署的实际战争文件?
我希望 Spring 的嵌入式数据库初始化可以使用文件以外的东西。我考虑过 JNDI,但这似乎需要使用测试数据的资源定义来污染 web.xml 文件,这些测试数据将(再次)出现在可部署的战争中。或者也许有使用货物的选择?一些我不知道的 Spring 编程技巧?