首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringBoot - @SpringBootTest加速单元测试的小窍门

SpringBoot - @SpringBootTest加速单元测试的小窍门

作者头像
小小工匠
发布2021-08-17 10:31:16
发布2021-08-17 10:31:16
3.7K0
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

文章目录


Pre

SpringBoot - 应用程序测试方案

随着代码量的争夺,测试类的启动速度变得越来越慢,而大多数情况下只是为了测试一下某个实现类的某个方法而已,比如测试一个DAO层的方法,却要启动这个应用。

今天我们继续深入了解一下 稍微高级一点的用法


classes

classes 属性用来指定运行测试类需要装载的 class 集合,如果不指定,那么会默认装载 @SpringBootConfiguration 注解标注的类

如果不指定classes属性,那么启动测试类时需要加载的Bean的数量和正常启动一次入口类加载的 Bean 数量是一样的。

如果你的项目中有很多个 Bean, 特别是有以下几种时:

  • 有 CommandLineRunner 的实现类
  • 用 @PostConstruct 注解指定了初始化方法的类

这几种类在程序初始化的过程中都会运行自身的业务代码或者初始化代码,从而延后了测试方法的运行。

在这种情况下,我们在编写测试类的时候,如果明确这个测试类会用到哪几个 Bean,则可以在 classes 属性处指定,之后启动测试类的时候,就只会加载需要的 Bean 到上下文中,从而加快启动速度。比如:

用法

代码语言:javascript
复制
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes={ArtisanServiceImpl.class})

webEnvironment

这个属性的含义是说测试类要不要启动一个 web 环境, 要不要启动一个 Tomcat 容器,可选的值为:

  • MOCK, 启动一个模拟的 Servlet 环境, 默认值。
  • RANDOM_PORT,启动一个 Tomcat 容器,并监听一个随机的端口号
  • DEFINED_PORT,启动一个 Tomcat 容器,并监听配置文件中定义的端口(未定义则默认监听8080)
  • NONE,不启动 Tomcat 容器

怎么使用呢? 举个例子 如果你要测试的方法不需要用到 Tomcat 容器,比如:

  • 测试 DAO 类的CRUD
  • 测试Service 类的业务方法
  • 测试工具类的公用方法
  • 测试配置文件类是否读取到了正确的值

用法

只需要通过指定 @SpringBootTest(webEnvironment =

SpringBootTest.WebEnvironment.NONE) 即可达到加速的效果。这时测试类启动时就只会初始化 Spring 上下文,不再启动 Tomcat 容器了:

代码语言:javascript
复制
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class ArtisanServiceTests {
    
    @Autowired
    private IArtisanSerive artisanService;
    
    @Test
    public void test() {
        // ...
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • Pre
  • classes
    • 用法
  • webEnvironment
    • 用法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档