最老的方式,你可能会使用 @ContextConfiguration
注释和 SpringApplicationContextLoader
的组合去写单元测试。
当然,我们可以去掉 loader 的配置,使用方法2 的 SpringApplicationConfiguration
注解去测试
当想写一个集成测试的时候,可以使用 IntegrationTest
注解,和前面的不一样的是,前面两种方式不会初始化全部的 Bean,而 IntegrationTest
会和生产环境一样,完整初始化程序。但是它不会初始化 嵌入式的 Servlet 容器。
当你需要嵌入式的 Servlet 容器做一些接口的集成测试的时候,就需要使用 WebIntegrationTest
注解
然而一个项目,基本上包含 SpringApplication
和 main 方法的类只有一个,所以在1.4 之后,我们连 App.class 都不需要给定,直接使用 @SpringBootTest
注解即可,更加优雅。
这个就是我基于 Spring Boot 1.3 写的一个集成测试,当然它使用的是我们前面说的方法3。
前面我们其实已经说到了 Spring Boot 的 Profile
可以让我们区分不同环境下加载的配置文件。比如开发环境,测试和线上,很多值都可以实现定制,而不需要重新打包项目。
使用 Profile 的第二个场景就是不同的 Profile 需要初始化不同的bean,比如以 DataSource 为例,测试的时候,因为测试环境不一样,我们更期望 DataSource 能用 H2一类的嵌入式数据库模拟。开发和生产环境,就需要初始化一个 MySQL 的 DataSource。当然我说的这个场景不需要我们专门去配置,因为 Spring Boot 已经替我们考虑到了这种情况,在需要 DataSource,但是没有这个 Bean,切依赖了 H2的 Driver 的时候,Spring 会自动创建一个 H2 的 DataSource。
还有一个我使用 Profile的场景就是 Swagger,它十分好用,尤其是开发的时候能基于注解自动生成 API Doc,和测试页面,然而,会存在的问题就是它有漏洞,我只希望在开发的时候启用 Swagger,这个时候就可以利用 Profile 来实现。
Profile 可以启用一个或者多个,然而,也会导致一些问题,比如我们没有指定 Profile 的时候怎么办,或者我们有 profile 名为 mysql、cassadra。它们是相互 block 的,如何检查校验,避免冲突的 profile 同时启用呢?
讲得好!