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

Spring Boot进行单元测试,一个思路解决重启低效难题

所谓单元测试就是对功能最小粒度的测试,落实到JAVA中就是对单个方法的测试。

junit可以完成单个方法的测试,但是对于Spring体系下的web应用的单元测试是无能为力的。因为spring体系下的web应用都采用了MVC三层架构,依托于IOC,层级之间采用了依赖注入的方式来进行调用。如果应用不启动、IOC容器不进行初始化、依赖没有被注入进IOC容器,根本就没办法正常的使用。调controller,会由于service没注入而报空指针异常,调service,会由于dao没注入而报空指针异常。

所以我们发现想要对Spring Boot进行单元测试,前置条件就是需要启动应用,或者说准确点是需要启动IOC。但很明显我们又不可能每次都去直接启动应用来进行测试,一些架构糟糕、很重的老应用启动,动不动就是几分钟甚至十几分钟。我们不可能每次写一点新的代码,想要测试就去重启一下,这样效率太低了。

为此spring boot test为我们提供了@SpringBootTest来对SpringBoot应用进行快捷的单元测试。

基本使用

一般单元测试类我们都放在test路径下,一个@Test就是一个case(用例):

在从 Spring Boot 1.4.0 版本以前@SpringBootTest需要和@RunWith配合来使用

@RunWith(SpringRunner.class)用来指定启动类是哪个?@SpringBootTest用来加载应用上下文

依赖:

  1. import org.junit.runner.RunWith;

  2. import org.springframework.boot.test.context.SpringBootTest;

  3. import org.springframework.test.context.junit4.SpringRunner;

  4. @RunWith(SpringRunner.class)

  5. @SpringBootTest

  6. public class MyApplicationTests {

  7. // 测试内容

  8. }

代码示例:

  1. import org.junit.runner.RunWith;

  2. import org.springframework.boot.test.context.SpringBootTest;

  3. import org.springframework.test.context.junit4.SpringRunner;

  4. @RunWith(SpringRunner.class)

  5. @SpringBootTest

  6. public class MyApplicationTests {

  7. // 测试内容

  8. }

在从 Spring Boot 1.4.0 版本开始就不用加上@RunWith了,直接使用@SpringBootTest就可以了。

代码示例:​​​​​​​

  1. import org.springframework.boot.test.context.SpringBootTest;

  2. import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;

  3. import com.example.MyApplication; // 替换成实际的主启动类所在的包

  4. @SpringBootTest(classes = MyApplication.class)

  5. public class MyApplicationTests {

  6. // 测试内容

  7. }

3.优势

我猜到这儿很多小伙伴有所疑惑:

既然@SpringBootTest也要启动主启动类,那和我们直接启动SpringBoot应用来测试有什么区别喃?@SpringBootTest的优势在哪儿?

答案是——轻量级:

@SpringBootTest 注解提供了轻量级的测试环境,相比直接启动整个应用程序,它可以只加载所需的配置和组件,从而使测试更加迅速。这对于单元测试是非常有利的,因为它们通常关注的是某个组件或模块的功能,而不是整个应用程序。

4.常用属性

@SpringBootTest 注解提供了许多属性,用于配置测试的上下文加载和应用程序启动。以下是一些常用的 @SpringBootTest 属性:

classes:

指定启动测试时加载的配置类或主启动类。可以使用其中一个属性,根据需要选择。

webEnvironment:

指定测试的 Web 环境。可以设置为 WebEnvironment.MOCK(默认值,使用 MockMvc)或 WebEnvironment.RANDOM_PORT(随机端口,真正启动嵌入式容器)等。

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

WebEnvironment.MOCK:

在这种模式下,不会启动真正的嵌入式 Web 服务器,而是使用 MockMvc 框架模拟 HTTP 请求和响应。这样可以在没有真实服务器的情况下测试控制器的行为。适用于测试控制器层的逻辑,但不需要测试整个 Web 应用程序的场景。

WebEnvironment.RANDOM_PORT:

在这种模式下,会启动嵌入式 Web 服务器,并使用一个随机的端口。这允许测试整个应用程序的集成,包括 HTTP 请求和响应。适用于测试整个应用程序的场景,但不会影响外部系统。

WebEnvironment.DEFINED_PORT:

与 RANDOM_PORT 类似,但是在这种模式下,使用的端口是固定的,可以在属性中配置。这适用于需要预定义端口的场景,例如与外部系统集成时。

WebEnvironment.NONE:

在这种模式下,不会启动任何嵌入式 Web 服务器,也不会模拟 HTTP 请求和响应。这种模式适用于单元测试,主要测试业务逻辑,而不涉及与 Web 环境的交互。

properties:

指定配置属性。

@SpringBootTest(properties = "my.property=value")

exclude:

指定要排除的配置类。

@SpringBootTest(exclude = {SomeConfiguration.class, AnotherConfiguration.class})

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

http://www.gsyq.cn/news/181371.html

相关文章:

  • 2025年不锈钢筛管/筛板/水帽/中排/V型筛板实力厂家推荐:江苏润达筛管筛板有限公司,适配工业水处理、石油、化工多场景过滤需求 - 品牌推荐官
  • PyTorch安装踩坑总结:Windows/Linux/Mac通用解决方案
  • 可见光/近红外单光子探测器实力生产商,国产品牌哪家口碑好? - 品牌推荐大师
  • 从零开始搭建深度学习环境:Miniconda + PyTorch + CUDA全流程
  • 从申请到获批:新加坡移民公司成功案例有哪些?揭示核心竞争力! - 速递信息
  • 网关路由设计与性能优化
  • 工业物联网助力打造数字化工厂与智能制造管理体系
  • 摄像机实况画面条纹问题排查指导
  • 2025年离心玻璃棉板厂家权威推荐榜单:超细玻璃棉板/复合玻璃棉板/保温玻璃棉板/保温玻璃棉卷毡/大棚玻璃棉卷毡/硅酸铝毡/硅酸铝纤维毡源头厂家精选。 - 品牌推荐官
  • AppSpider 7.5.023 发布 - Web 应用程序安全测试
  • 必藏!5种大模型Agent工作流模式,告别乱七八糟的提示词,稳定输出高质量结果
  • 告别选厂难!2025杭州卡布灯箱工厂优选 - 栗子测评
  • 2025年空气弹簧/电磁式/薄膜式/主动式/气浮减震器推荐:北京恒帆减振科技全系产品解决方案 - 品牌推荐官
  • HTML Canvas绘图交互:Miniconda-Python3.9镜像Bokeh可视化库
  • 运维系列数据库系列【仅供参考】:达梦数据库:dokcer安装dm8-2
  • 2026年中国领先战略咨询公司/管理咨询公司/企业咨询培训公司/品牌咨询公司/营销咨询公司盘点 - 栗子测评
  • java执行JavaScriptUtil运转
  • 5050幻彩灯珠厂家有哪些?2025专业制造商深度剖析 - 栗子测评
  • 三雄极光全光谱照明的品牌历史、市场占有率及线下评价如何? - myqiye
  • 安装android studio时出现下面报错source-36_r01.zip安装失败
  • JAVA分块上传组件的跨平台兼容性讨论
  • 2025年优质矿石分析仪推荐,高灵敏度求推荐矿石分析仪品牌排名全解析 - 工业品牌热点
  • 机器学习065:深度学习【模型框架】PyTorch vs TensorFlow:给初学者的AI框架选择指南
  • 2025北京化粪池清理服务推荐榜:和信通管道疏通有限公司,朝阳区/通州/大楼/附近/小区化粪池清理,全场景覆盖化粪池清理需求 - 品牌推荐官
  • 告别无效联系!天下工厂查询工具真实体验报告
  • udev规则文件的作用
  • 2025年河北公共卫生间隔断安装公司推荐:公共卫生间隔断报价/商场卫生间隔断包工/铝蜂窝卫生间隔断/商场卫生间隔断包料/商场卫生间隔断服务商精选 - 品牌推荐官
  • 智能装备工厂10个研发人员用SolidWorks如何共享一台服务器算力和资源
  • 怎样才能成为一名黑客?新手必掌握的 12 个基础步骤
  • 社区公告推送小程序,输入公告信息,自动推送给小区用户,支持点赞和评论,解决社区公告传达不及时的问题。