SpringBoot @SpringBootTest加速单元测试的小诀窍
作者:小小工匠 发布时间:2022-12-17 13:05:06
@SpringBootTest加速单元测试小诀窍
Pre
SpringBoot - 应用程序测试方案
随着代码量的争夺,测试类的启动速度变得越来越慢,而大多数情况下只是为了测试一下某个实现类的某个方法而已,比如测试一个DAO层的方法,却要启动这个应用。
今天我们继续深入了解一下 稍微高级一点的用法
classes
classes 属性用来指定运行测试类需要装载的 class 集合,如果不指定,那么会默认装载 @SpringBootConfiguration 注解标注的类。
如果不指定classes属性,那么启动测试类时需要加载的Bean的数量和正常启动一次入口类加载的 Bean 数量是一样的。
如果你的项目中有很多个 Bean, 特别是有以下几种时:
有 CommandLineRunner 的实现类
用 @PostConstruct 注解指定了初始化方法的类
这几种类在程序初始化的过程中都会运行自身的业务代码或者初始化代码,从而延后了测试方法的运行。
在这种情况下,我们在编写测试类的时候,如果明确这个测试类会用到哪几个 Bean,则可以在 classes 属性处指定,之后启动测试类的时候,就只会加载需要的 Bean 到上下文中,从而加快启动速度。比如:
用法
@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 容器了:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class ArtisanServiceTests {
@Autowired
private IArtisanSerive artisanService;
@Test
public void test() {
// ...
}
}
@记录使用SpringBootTest遇到的坑
导入junit依赖,运行会报错
这里变红了,只需要spring-boot-starter-test依赖就好
删掉junit依赖
运行成功!
来源:https://artisan.blog.csdn.net/article/details/117232544


猜你喜欢
- 本文实例讲述了Java编程实现向文本文件中读取数据之Scanner用法。分享给大家供大家参考,具体如下:使用Scanner类来读取文件我们使
- 1、不要为抽象类提供公开的构造方法抽象类可以有构造方法,但是抽象类不能实例化。如果编程人员没有制定构造方法,编译器会自动生成一个默认的pro
- 本文实例讲述了java实现简单的英文文本单词翻译器功能。分享给大家供大家参考,具体如下:直接上代码:package fanyi;import
- 网络办公正逐渐成为常态,无纸化办公也是一个潮流,这二者需要电子签章,最简单的方法就是在纸上盖一个章然后扫描成电子图片文件,最后在你的系统加载
- 缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力。本文主要针对自己在Winform方
- 前言本文的多租户是基于多数据库进行实现的,数据是通过不同数据库进行隔离。下面话不多说,来看看详细的介绍:MyCat 基本配置首先针对多租户配
- springboot启动是通过一个main方法启动的,代码如下@SpringBootApplicationpublic class Appl
- 1.由json字符串转换成Map对象如json字符串:{"contend":[{"bid":&quo
- 提到数组大家肯定不会陌生,但我们也知道数组有个缺点就是在创建时就确定了长度,之后就不能更改长度。所以Java官方向我们提供了ArrayLis
- 1、通过WindowManager获取DisplayMetrics dm = new DisplayMetrics();getWindowM
- 为什么我们需要IntentService ?Android中的IntentService是继承自Service类的,在我们讨论IntentS
- 本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用。具体方法如下:一、通过子类无参构造函数创建子类实例创建父类Person
- 小总结抛出异常:创建异常对象,封装异常信息然后通过throw将异常对象传递给调用者。不对异常进行处理只对异常进行抛出是非常不负责任的表现可以
- 插入排序原理①把所有元素分成已排序和未排序两组②找到未排序组的第一个元素,向已经排序的组中进行插入③倒序遍历已经排好的元素,依次和待插入的元
- mybatis count()按条件查询1、sql count()函数count()函数返回匹配指定条件的行数。sql count(colu
- 错误使用New HttpClient如下面一段代码,日常开发中经常使用的 call http 方式,每次 new 一个 HttpClient
- 传统的Trie实现简单,但是占用的空间实在是难以接受,特别是当字符集不仅限于英文26个字符的时候, * 起来的空间根本无法接受。双数组Trie
- 我就废话不多说了,大家还是直接看代码吧~import java.util.concurrent.ExecutorService; impor
- 本文实例为大家分享了无限级联下拉列表框的的实现方法,具体内容如下可能有一个树型结构的表,它可能有ID,Name,ParentID,Level
- 话不多说,上来就是干!?1234567891011121314151617181920212223242526272829303132333