当前位置: 首页 > ai >正文

【第九篇】 SpringBoot测试补充篇

简介

        本文介绍了SpringBoot测试中的五项关键技术:测试类专用属性加载、 测试类专用Bean配置、 表现层测试方法、测试类事务回滚控制、配置文件随机数据设置)。这些技术可以有效隔离测试环境,确保测试数据不影响生产环境,同时提供了便捷的测试验证手段。文章内容若存在错误或需改进的地方,欢迎大家指正!若对操作有任何疑问欢迎留言!非常感谢!

目录

一、加载测试类专用属性

1、使用@SpringBootTest的properties属性

2、使用@SpringBootTest的args属性

二、测试类专用Bean

1、创建配置类

2、在需要引用的类上面声明引入配置类

三、测试表现层

1、测试类中启动web环境

2、发送虚拟请求

(1)开启发送虚拟请求的功能

(2)发送虚拟请求

(3)测试

3、匹配响应

(1)匹配响应结果

(2)匹配响应体

(3)匹配响应头

四、测试类的事务回滚

1、事务回滚实现

五、配置文件设置随机数据

1、设置随机数据

2、测试


一、加载测试类专用属性

        如果只想在当前测试类中加载专用属性,而不影响其他任何代码,那么就可以使用下面的方式。

1、使用@SpringBootTest的properties属性

        第一种方式是可以使用@SpringBootTest注解的properties属性进行配置当前测试类的临时属性,仅在当前类生效,参数是一个数组。

        可以看到下面连resources目录都没有,但是临时配置可以生效。若resources目录下的application配置文件存在,那么当前测试类会先加载配置文件,然后再加载这个类的临时属性,相同的属性会被临时属性覆盖,不同的属性全都保留。

2、使用@SpringBootTest的args属性

        第二种方式是可以使用@SpringBootTest注解的args属性进行配置当前测试类的临时属性,仅在当前类生效,参数是一个数组。

        args属性的级别比properties级别高,也就是说属性同时存在时,args属性会覆盖相同属性。

二、测试类专用Bean

        如果在测试的时候需要引入一下外部的Bean,仅仅在当前测试类中使用,而不在全局生效,那么就可以使用下面的方式。

1、创建配置类

        这里使用Student类做为第三方Bean使用

        首先是先在test目录下创建一个配置类,注意这个类并没有任何注解进行声明,就是一个普通的类,然后写一个方法,方法的返回值就是第三方类,并使用@Bean注解进行声明。由于当前类是一个普通类,就算方法上面声明了@Bean注解,也不会主动成为IOC容器中的Bean。

2、在需要引用的类上面声明引入配置类

        在需要使用Bean的测试类上面使用@Import注解引入配置类,然后在测试类里面就能正常使用第三方Bean了。这是因为使用@Import注解,只有当运行了当前测试类的时候,会自动将配置类注册为IOC容器中的Bean,当配置类成为IOC容器中的Bean之后,就会将被@Bean声明的方法的返回值也注册为Bean,于是在当前类中就可以使用第三方Bean了。

三、测试表现层

1、测试类中启动web环境

        测试类中默认是步启动web环境的,需要进行一些配置让测试类也能启动web环境。只需要给@SpringBootTest注解的webEnvironment属性赋值即可,webEnvironment属性值默认是SpringBootTest.WebEnvironment.NONE,代表不启动web环境,那么只需要设置为DEFINED_PORT或者RANDOM_PORT即可。

  • DEFINED_PORT:表示使用默认的端口启动web环境,也就是程序设置的端口是多少就使用多少。
  • RANDOM_PORT:表示使用随机的端口启动web环境,这里不会出现端口冲突。

2、发送虚拟请求

(1)开启发送虚拟请求的功能

        在当前测试类上声明@AutoConfigureMockMvc注解,该注解作用是开启发送虚拟请求的功能。

(2)发送虚拟请求

        开启启动web环境和发送虚拟请求的功能之后,只需要在当前测试类中注入MockMvc对象,然后使用MockMvc对象调用perform方法即可发送虚拟请求。perform方法接收一个RequestBuilder类型的对象,RequestBuilder是一个接口,MockHttpServletRequestBuilder是它的实现类,所以需要创建一个MockHttpServletRequestBuilder对象传递给perform方法。MockHttpServletRequestBuilder对象的创建是通过抽象类MockMvcRequestBuilders调用方法创建,抽象类MockMvcRequestBuilders可以调用get、post、put、delete等方法,方法入参是URL,也就是请求路径,这些方法也就代表了MockHttpServletRequestBuilder对象要发送什么请求,然后由perform方法发送。

(3)测试

        可以看到成功向getById方法发送Get请求。

3、匹配响应

        通过上面的设置就已经可以发送请求了,那么下面的操作就是匹配调用之后的结果了。当通过perform方法发送请求之后,会返回一个ResultActions对象,然后可以拿到这个对象调用andExpect方法进行匹配预期值,方法的入参是预期值,实际值已经在ResultActions对象中了,andExpect方法自带断言,若实际值与入参的预期值相同,那么就什么也不会发生,反之则会报错,并打印匹配的信息。

        预期值对象由抽象类MockMvcResultMatchers调用指定的方法得到,然后再由预期值对象设置预期值,然后作为参数传递给andExpect方法即可。MockMvcResultMatchers可以调用指定的方法获取请求信息和响应信息,下面举三个例子,其余校验只需要改变MockMvcResultMatchers调用的方法即可。

        因为成功之后不会有任何提示,所以下面的测试,会使用失败用例。

(1)匹配响应结果

        使用MockMvcResultMatchers调用status方法即可得到调用结果响应状态对象,然后使用该对象设置预期值,最后将调用结果响应状态对象传递给andExpect方法即可。

(2)匹配响应体

        使用MockMvcResultMatchers调用content方法即可得到响应体对象,然后使用该对象设置预期值,最后将响应体对象传递给andExpect方法即可。

(3)匹配响应头

        使用MockMvcResultMatchers调用header方法即可得到请求头对象,然后使用该对象设置预期值,最后将请求头对象传递给andExpect方法即可。

四、测试类的事务回滚

        在测试类中会有操作数据库的方法,类似于下面的操作,当每次运行测试类的时候,就会全量的执行这些方法,在执行这些方法的时候,会直接影响数据库的数据,因为测试数据是严禁影响真实数据的,那么所有测试类的测试方法中有关操作数据库的操作应该全部由事务管理并最终将事务全部回滚,保证不对真实数据造成任何影响。

1、事务回滚实现

        只需要在测试类上增加@Transactional和@Rollback(value = true)注解即可,并且@Rollback注解的属性value的值为true,就代表该测试类中所有有关数据库的操作全部回滚,如果需要提交事务,那么只需要将value的值设置为false即可。因为@Rollback注解的属性value的值默认就为true,所以如果只想设置事务全部回滚,那么只在测试类上加@Transactional一个注解也可以。

五、配置文件设置随机数据

        在配置文件中设置随机数据,不是专门为测试提供的功能,而是在测试的场景中使用的比较多,当然在其他地方使用也完全没有问题。

1、设置随机数据

        只需要在配置文件中使用${random.类型},即可获取随机值,具体类型如下。另外字符串类型的还可以自定义拼接字符串,整形和长整型的范围表示也不一定非得使用小括号。

2、测试

        使用正常属性绑定,然后获取实体类的Bean,然后直接打印即可看到效果。

上一篇——》【第八篇】 SpringBoot高级配置(配置篇)https://blog.csdn.net/qq1743177790/article/details/148513782

http://www.xdnf.cn/news/12740.html

相关文章:

  • Zustand 第二章(状态处理)
  • 【设计模式】2.策略模式
  • 【网站建设】不同类型网站如何选择服务器?建站项目实战总结
  • AI智能体|扣子(Coze)搭建【公众号对标文章采集拆解】工作流
  • DeepSeek11-Ollama + Open WebUI 搭建本地 RAG 知识库全流程指南
  • windows10下搭建nfs服务器
  • 【分布式】分布式ID介绍和实现方案总结
  • 力扣算法题1
  • Vue部署到Nginx上及问题解决
  • 深入理解 React Hooks
  • 通过css实现正方体效果
  • 【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
  • C++11 右值引用
  • Pandas-如何正确将两张数据表进行合并
  • 自定义protoc-gen-go生成Go结构体,统一字段命名与JSON标签风格
  • 【Zephyr 系列 15】构建企业级 BLE 模块通用框架:驱动 + 事件 + 状态机 + 低功耗全栈设计
  • github开源协议选择
  • iview-admin静态资源js按需加载配置
  • STM标准库-TIM旋转编码器
  • JAVASCRIPT 前端数据库-V6--仙盟数据库架构-—-—仙盟创梦IDE
  • 深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
  • 2025年夏第九届河北工业大学程序设计校赛
  • Linux 上的 Tomcat 端口占用排查
  • 2025-06-08 思考-人被基因和社会关系双重制约
  • Psychopy音频的使用
  • 实验四:图像灰度处理
  • 自动化立体仓库堆垛机控制系统STEP7 OB1功能块
  • python打卡day48
  • 《解锁树莓派+Java:TinyML模型部署的性能飞升秘籍》
  • Java 面向对象进阶之多态:从概念到实践的深度解析