如何在maven中完成集成测试后运行包目标?

时间:2016-02-20 04:54:22

标签: java spring maven integration-testing

默认构建maven周期是这样的:

  1. 编译
  2. 测试
  3. 预intergation测试
  4. intergation测试
  5. - intergation后测试
  6. 验证
  7. 安装
  8. pre-intergation-test开启数据库。 intergation-test是弹出测试,当应用程序启动并针对数据库进行测试时。在post-intergation-test数据库关闭。

    因此,对于这种情况,不需要打包整个应用程序,有没有办法在验证目标后打包应用程序

1 个答案:

答案 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文件初始化数据库(加载应用程序上下文时)。