默认构建maven周期是这样的:
在pre-intergation-test
开启数据库。 intergation-test
是弹出测试,当应用程序启动并针对数据库进行测试时。在post-intergation-test
数据库关闭。
因此,对于这种情况,不需要打包整个应用程序,有没有办法在验证目标后打包应用程序?
答案 0 :(得分:0)
maven生命周期中的集成测试阶段的目的是测试打包的工件。因此,在包阶段之前尝试执行集成测试是没有意义的。
另一方面,您有测试阶段来执行单元测试。如果您遵循严格的单元测试定义:他们不应该需要数据库。换句话说,在单元测试执行期间:应该模拟数据库。
据我了解您的情况,您需要一个需要数据库的单元测试。这不是一个完美的设计,在理想的世界中,您应该考虑重新设计单元测试以使用模拟而不是数据库。
但您也可以使用一种中间解决方案,在测试阶段之前/之后启动/停止数据库。 Here is the full life-cycle reference正如您所看到的,您可以将数据库启动绑定到generate-test-resources
阶段。 (我不推荐这个解决方案,因为你的单元测试运行起来很重,从你的IDE中运行它们也变得有点复杂,因为它需要执行maven阶段)
常用的替代解决方案是在测试本身中设置一个小的内存数据库。使用spring非常容易,这里有一个示例测试配置来演示:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import javax.sql.DataSource;
@Configuration
public class UnitTestWithDBConfiguration {
@Bean
public DataSource dataSource(){
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.setScriptEncoding("UTF-8")
.ignoreFailedDrops(true)
.addScript("dbsetup.sql")
.build();
}
}
此示例使用h2数据库+ src / test / resources / dbsetup.sql文件初始化数据库(加载应用程序上下文时)。