【Spring Boot】单元测试

单元测试

单元测试在日常项目开发中必不可少,Spring Boot提供了完善的单元测试框架和工具用于测试开发的应用。接下来介绍Spring Boot为单元测试提供了哪些支持,以及如何在Spring Boot项目中进行单元测试。

1.Spring Boot集成单元测试

单元测试主要用于测试单个代码组件,以确保代码按预期方式工作。目前流行的有JUnit或TestNG等测试框架。Spring Boot封装了单元测试组件spring-boot-starter-test。下面通过示例演示Spring Boot是如何实现单元测试的。

(1)引入依赖

首先创建Spring Boot项目。在项目中引入spring-boot-starter-test组件,示例配置如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

(2)创建单元测试

在src/test目录下新建一个HelloTest测试类,如果只想输出一句“Hello Spring Boot Test”,只需要用一个@Test注解即可。示例代码如下:

@SpringBootTest
public class HelloTest {@Testpublic void hello () {System.out.println("Hello Spring Boot Test");}
}

在类的上面添加@SpringBootTest注解,系统会自动把这段程序加载到Spring Boot容器。@Test注解表示该方法为单元测试方法。

(3) 运行单元测试

单击Run Test或在方法上右击,再选择“Run ‘hello’”,运行测试方法,运行结果如图所示。

在这里插入图片描述

由图可知,单元测试方法运行成功并输出相应的结果,同时IDEA也会显示运行的所有单元测试结果,包括测试是否通过、运行时间、测试总数和成功次数等。以上示例中的测试方法只是spring-boot-starter-test组件中的一部分功能,Spring Boot自带的spring-boot-starter-test框架对测试的支持非常完善,包括Web请求测试、Service方法测试等,后面会逐一介绍。

2.测试Service方法

一般使用Spring Boot进行单元测试主要是针对Service和API(Controller)进行。接下来通过示例演示Spring Boot如何测试Service方法。

(1)创建Service测试类

创建Service测试类非常简单,使用IDEA可以一键自动创建单元测试类。首先,选择需要测试的Service类或方法,然后在对应的Service类中右击,选择Go To→Test→Create New Test,打开如图所示的创建测试类界面。

在这里插入图片描述

单击OK按钮,IDEA会在Test目录下创建一个UserServiceTest测试类,并为勾选的测试类自动生成单元测试的方法。

(2) 实现单元测试

在上面创建好的UserServiceTest类中会自动创建对应的单元测试方法,我们只需要在测试方法中实现对应的测试代码即可,具体的示例代码如下:

@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void findOne() throws Exception {Assert.assertEquals("1002", userService.findOne());}
}

如以上示例代码所示,在自动测试类上增加@SpringBootTest注解即可。首先注入需要测试的Service,然后在单元测试中调用该方法,最后通过Assert断句判断返回结果是否正确。

执行单元测试也非常简单,只需将鼠标放在对应的方法上,右击并选择Run执行该方法即可。

3.测试Controller接口方法

上面是针对Service进行测试,但是有时需要对API(Controller)进行测试,这时需要用到MockMvc类。MockMvc能够模拟HTTP请求,使用网络的形式请求Controller中的方法,这样可以使得测试速度快、不依赖网络环境,而且它提供了一套完善的结果验证工具,测试和验证也非常简单、高效。

spring-boot-starter-test具备强大的Mock能力,使用@WebMvcTest等注解实现模拟HTTP请求测试。下面通过示例演示如何测试Controller接口。

步骤01 创建Controller的测试类HelloControllerTest,实现单元测试方法。示例代码如下:

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
class HelloControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void hello() throws Exception {mockMvc.perform(MockMvcRequestBuilders.post("/hello").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andDo(print());}
}

在上面的示例中,通过使用MockMvc构造一个post请求,MockMvcRequestBuilders可以支持post和get请求,调用print()方法将请求和相应的过程都打印出来。示例代码说明如下:

MockMvcRequestBuilders.post(“/hello”):构造一个post请求。

contentType (MediaType.APPLICATION_JSON)):设置JSON返回编码,避免出现中文乱码的问题。

andExpect(status().isOk()):执行完成后的断句,请求的状态响应码是否为200,如果不是则测试不通过。

andDo(print()):添加一个结果处理程序,表示要对结果进行处理,比如此处调用print()输出整个响应结果信息。

步骤02 执行单元测试。

完成测试方法之后,执行测试方法:将鼠标放在对应的方法上,右击并选择Run执行该方法即可。可以看到输出如下:

在这里插入图片描述

从上面的输出中可以看到,返回完整的Http Response,包括Status=200、Body = hello Spring Boot,说明接口请求成功并成功返回。

如果接口有登录验证,则需要通过MockHttpSession注入用户登录信息,或者修改登录拦截器取消对单元测试的登录验证。

4.常用的单元测试注解

在实际项目中,除了@SpringBootTest、@Test等注解之外,单元测试还有很多非常实用的注解,具体说明如表所示。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频编码实战-------pcm+yuv数据转成MP4

文章目录 1.编码流程图2.相关模块及函数2.1 编码器相关API2.2 复用器相关API2.3 重采样相关API注意点 简单的编码流程相关代码 1.编码流程图 2.相关模块及函数 2.1 编码器相关API avcodec_find_encoder: 根据编码器ID查找编码器 avcodec_alloc_context3:创建编码器上下文 avc…

苹果平板电容笔好用吗?第三方apple pencil推荐

自从苹果推出了ipad的电容笔之后&#xff0c;一直在市场上保持着十分火爆的热度&#xff0c;但是因为Apple Pencil的价格太高&#xff0c;一般的消费者根本没有足够预算去入手。所以市场上就不断涌现出了不少可以很好代替Apple Pencil的平替电容笔&#xff0c;并且深受人们的热…

SPI与Springboot自动装配

目录 SPIspringboot的自动配置依赖于类似SPI的机制Dubbo的SPI机制SPI、双亲委派机制、线程上下文类加载器 SPI SPI1,2是一种将服务接口与服务实现分离以达到解耦、大大提升了程序可扩展性和灵活性的机制。引入服务提供者&#xff08;也即SPI接口的实现者&#xff09;&#xff…

js逆向补环境-b站志远二期最后8节课笔记

目录 一、基础知识1、什么是纯净V82、什么是BOM和DOM3、node环境/浏览器环境/V8引擎区别4、如何本地调试js补环境5、补环境相对于逆向算法的好处6、vm和vm2介绍 二、8个视频内容笔记概括1、补环境基本知识/头条案例手动插桩补2、Proxy代理/toString函数保护介绍3、补环境框架设…

PMP 3A备考指南

1、学习内容&#xff1a;如果上班能学习&#xff0c;上班学 慢慢悠悠3月 书过一遍 记大概框架&#xff0c;预测型记五大过程组 十大知识领域要知道为什么是这个过程 记为什么 死记打咩 看光环网课 有讲 老师很清楚明了 用上下班时间看 跟着老师思路走就行。敏捷直接看一遍视频&…

利用Adobe Acrobat DC实现图片和PDF互相转换

一、图片转PDF 可以实现多张或者单张图片转PDF! 这个需要使用到Adobe Acrobat DC的文件合并功能&#xff0c;因为Adobe Acrobat DC的文件合并&#xff0c;不仅可以合并多个pdf文件&#xff0c;也支持合并图片文件。 如图&#xff0c;直接选中多张图片合成即可&#xff1a; 添…

微信小程序上线与发布图文步骤操作

1.上传代码 打开微信小程序&#xff0c;在微信开发者工具的工具栏中单击“上传”按钮&#xff0c;页面中弹出提示框&#xff0c;根据提示填写相应的信息&#xff0c;然后单击“上传”按钮&#xff0c;即可上传代码。 2.查看上传代码之后的版本 登录微信小程序管理后台&…

数仓报表数据导出——Hive数据导出至Clickhouse

1. Clickhouse建表 创建database create database ad_report; use ad_report;创建table drop table if exists dwd_ad_event_inc; create table if not exists dwd_ad_event_inc (event_time Int64 comment 事件时间,event_type String comment 事件…

python爬虫_django+vue+echarts可视化查询所有CSDN用户质量分

文章目录 ⭐前言⭐ 效果⭐django简介⭐vue3简介⭐vue引入echarts ⭐前后分离实现&#x1f496; django代码层&#x1f496; vue3代码层结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于前后分离djangovueecharts可视化查询CSDN用户质量分。 该系列文章&#…

Spring IoC及DI依赖注入

Spring 1.Spring的含义&#xff1a; Spring 可从狭义与广义两个角度看待 狭义的 Spring 是指 Spring 框架(Spring Fremework) 广义的 Spring 是指 Spring 生态体系 2.狭义的 Spring 框架 Spring 框架是企业开发复杂性的一站式解决方案 Spring 框架的核心是 IoC 容器和 AO…

LayUi之选项卡的详解(附源码讲解)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.选项卡是什么 二.选项卡在什么时候使用…

java版鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统源代码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

【云原生】· 一文了解docker中的网络

目录 &#x1f352;查看docker网络 &#x1f352;bridge网络 &#x1f352;none网络 &#x1f352;host网络 &#x1f352;自定义容器网络 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;云原生专栏 根据前面的学习&#xff0c;已经对d…

Qt/C++原创项目作品精选(祖传原创/性能凶残)

00 前言说明 从事Qt开发十年有余&#xff0c;一开始是做C#.NET开发的&#xff0c;因为项目需要&#xff0c;转行做嵌入式linux开发&#xff0c;在嵌入式linux上做可视化界面开发一般首选Qt&#xff0c;当然现在可选的方案很多比如安卓&#xff0c;但是十多年前那时候板子性能低…

服务器反向代理

反向代理作用 隐藏服务器信息 -> 保证内网的安全&#xff0c;通常将反向代理作为公网访问地址&#xff0c;web服务器是内网&#xff0c;即通过nginx配置外网访问web服务器内网 举例 百度的网址是&#xff1a;http://www.baidu.com &#xff0c; 现在我通过自己的服务器地…

unity 调用C++ dll 有类和指针操作

这个在之前unity 调用C dll 操作升级套娃函数调用_天人合一peng的博客-CSDN博客的基础上&#xff0c;但实事时类相互嵌套&#xff0c;非常不好处理。 1 测试直接将main()生成dll程序能运行不。 发现是可以的。 2 那就是想方法把对象或指针的操作的下一级函数直接写到main里面&…

STM32基础知识点总结

一、基础知识点 1、课程体系介绍 单片机概述arm体系结构STM32开发环境搭建 STM32-GPIO编程-点亮世界的那盏灯 STM32-USART串口应用SPI液晶屏 STM32-中断系统 STM32-时钟系统 STM32-ADC DMA 温湿度传感器-DHT11 2.如何学习单片机课程 多听理论、多理解、有问题及时提问 自己多…

ChatGPT助力校招----面试问题分享(十一)

1 ChatGPT每日一题&#xff1a;PCB布线&#xff0c;高速信号线走直角的后果 问题&#xff1a;PCB布线&#xff0c;高速信号线走直角的后果 ChatGPT&#xff1a;对于高速信号线来说&#xff0c;最好避免使用直角布线。直角布线会引入反射和信号损耗&#xff0c;从而导致信号完…

【Python】selenium项目实战:从12306网站获取特定时间段二等座有票的车次

文章目录 一、项目背景二、页面查找1、查询条件2、定位有二等座的元素3、定位有二等座的车次信息4、CtrlF检验xpath查找的车次 三、代码实现 一、项目背景 工具&#xff1a; pythonpycharmselenium 12306网址&#xff1a; https://kyfw.12306.cn/otn/leftTicket/init?linktyp…

【云原生】Docker跨主机网络Overlay与Macvlan的区别

跨主机网络通信解决方案 docker原生的overlay和macvlan 第三方的flannel&#xff0c;weave&#xff0c;calico 1.overlay网络 在Docker中&#xff0c;Overlay网络是一种容器网络驱动程序&#xff0c;它允许在多个Docker主机上创建一个虚拟网络&#xff0c;使得容器可以通过这…