测试之Springboot应用

测试之Spring Boot应用

在软件开发过程中,测试是确保代码质量的重要环节。本文将介绍针对Spring Boot应用的单元测试、集成测试和端到端测试的策略,以及如何使用Mock对象和测试切片来模拟外部依赖。同时,我们将使用JUnit和Spring Test框架进行测试。

1. 单元测试

单元测试是对应用程序中的最小可测试单元(如方法、类等)进行测试。在Spring Boot中,我们可以使用JUnit和Spring Test框架进行单元测试。以下是一个简单的示例:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;@SpringBootTest
class MyServiceTest {@MockBeanprivate MyRepository myRepository;@Autowiredprivate MyService myService;@Testvoid testGetCount() {when(myRepository.count()).thenReturn(42L);assertEquals(42, myService.getCount());}
}

在这个例子中,我们使用了@SpringBootTest注解来启动Spring Boot应用程序上下文,并使用@MockBean注解来模拟MyRepository类的实例。然后,我们使用JUnit的@Test注解来定义一个测试方法,并使用Mockito的whenthenReturn方法来模拟myRepository.count()方法的返回值。最后,我们使用JUnit的assertEquals方法来验证myService.getCount()方法的返回值是否与预期相符。

要使用JUnit和Spring Test框架进行单元测试,我们需要添加以下Maven依赖:

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

2. 集成测试

集成测试是在单元测试的基础上,对多个组件之间的交互进行测试。在Spring Boot中,我们可以使用@SpringBootTest注解来进行集成测试。以下是一个简单的示例:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;import static org.junit.jupiter.api.Assertions.assertEquals;@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class MyControllerTest {@Autowiredprivate TestRestTemplate restTemplate;@Testvoid testGetHello() {ResponseEntity<String> response = restTemplate.getForEntity("/hello", String.class);assertEquals(HttpStatus.OK, response.getStatusCode());assertEquals("Hello, World!", response.getBody());}
}

在这个例子中,我们使用了@SpringBootTest注解来启动Spring Boot应用程序上下文,并设置了webEnvironment属性为RANDOM_PORT,以便在随机端口上启动嵌入式Web服务器。然后,我们使用@Autowired注解来注入TestRestTemplate类的实例。接下来,我们使用JUnit的@Test注解来定义一个测试方法,并使用restTemplate.getForEntity()方法来发送HTTP GET请求。最后,我们使用JUnit的assertEquals方法来验证响应的状态码和响应体是否符合预期。

要使用Spring Test框架进行集成测试,我们需要添加以下Maven依赖:

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

3. 端到端测试

端到端测试是对整个应用程序进行测试,包括前端和后端。在Spring Boot中,我们可以使用Selenium WebDriver或者Puppeteer等工具来进行端到端测试。以下是一个简单的示例:

import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;import static org.junit.jupiter.api.Assertions.assertEquals;public class MyE2ETest {@Testvoid testGetHello() {System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");WebDriver driver = new ChromeDriver();driver.get("http://localhost:8080/hello");WebElement body = driver.findElement(By.tagName("body"));assertEquals("Hello, World!", body.getText());driver.quit();}
}

在这个例子中,我们使用了Selenium WebDriver来启动Chrome浏览器,并访问我们的Spring Boot应用程序。然后,我们使用driver.findElement()方法来查找页面上的<body>元素,并使用body.getText()方法来获取元素的文本内容。最后,我们使用JUnit的assertEquals方法来验证文本内容是否符合预期。

要使用Selenium WebDriver进行端到端测试,我们需要添加以下Maven依赖:

<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version>
</dependency>

4. 使用Mock对象和测试切片模拟外部依赖

在单元测试中,我们经常需要模拟外部依赖,以便专注于测试目标组件。在Spring Boot中,我们可以使用Mockito框架来创建Mock对象,并使用@MockBean注解将其注入到测试类中。以下是一个简单的示例:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;@SpringBootTest
class MyServiceTest {@MockBeanprivate MyExternalService myExternalService;@Autowiredprivate MyService myService;@Testvoid testGetData() {when(myExternalService.getData()).thenReturn("mock data");assertEquals("mock data", myService.getData());}
}

在这个例子中,我们使用了@MockBean注解来模拟MyExternalService类的实例。然后,我们使用Mockito的whenthenReturn方法来模拟myExternalService.getData()方法的返回值。最后,我们使用JUnit的assertEquals方法来验证myService.getData()方法的返回值是否与预期相符。

要使用Mockito框架进行单元测试,我们需要添加以下Maven依赖:

<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.12.4</version><scope>test</scope>
</dependency>

此外,我们还可以使用测试切片(Test Slicing)技术来缩小测试范围,只运行与目标组件相关的测试用例。在Maven中,我们可以使用-Dtest=MyServiceTest参数来指定要运行的测试类;在Gradle中,我们可以使用-Dtest=MyServiceTest参数来指定要运行的测试类。这样,我们就可以避免运行不必要的测试用例,提高测试效率。

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

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

相关文章

简述分代垃圾回收器是怎么工作的?

分代垃圾回收器是一种用于管理和回收内存中垃圾对象的技术。它根据对象的存活时间将内存分为不同的代&#xff0c;并针对每个代应用不同的垃圾回收策略。 分代垃圾回收器的工作过程如下&#xff1a; 内存分代&#xff1a;首先&#xff0c;将内存分为不同的代&#xff0c;通常是…

解决 SpringBoot 的 Date、LocalDateTime 变成时间戳和数组的问题,创建自定义对象消息转换器

问题描述 SpringBoot 项目&#xff0c;当返回前端的数据类型为 Map 的时候&#xff0c;在 Map 中 put() 时间对象会出现以下问题&#xff1a; 传递的 Date 对象会变成时间戳传递的 LocalDateTime 对象会变成数组 问题复现 编写一个 Controller 方法&#xff0c;返回值为 Ma…

Java并发: 基于Unsafe的CAS实现无锁数据结构

在上一篇Java并发: 面临的挑战文章中说过CAS是解决原子性问题的方案之一。Unsafe提供了CAS的支持&#xff0c;支持实例化对象、访问私有属性、堆外内存访问、线程的启停等功能。 许多Java的并发类库都是基于Unsafe实现的&#xff0c;比如原子类AtomicInteger&#xff0c;并发数…

多线程(C++11)

多线程&#xff08;C&#xff09; 文章目录 多线程&#xff08;C&#xff09;前言一、std::thread类1.线程的创建1.1构造函数1.2代码演示 2.公共成员函数2.1 get_id()2.2 join()2.3 detach()2.4 joinable()2.5 operator 3.静态函数4.类的成员函数作为子线程的任务函数 二、call…

【Linux学习】深入探索进程等待与进程退出码和退出信号

文章目录 退出码return退出 进程的等待进程等待的方法 退出码 main函数的返回值&#xff1a;进程的退出码。 一般为0表示成功&#xff0c;非0表示失败。 每一个非0退出码都表示一个失败的原因&#xff1b; echo $&#xff1f;命令 作用&#xff1a;查看进程退出码。&#xf…

I.MX6ULL Linux C语言开发环境搭建(点灯实验)

系列文章目录 I.MX6ULL Linux C语言开发 I.MX6ULL Linux C语言开发 系列文章目录一、前言二、硬件原理分析三、构建步骤一、 C语言运行环境构建二、软件编写三、链接脚本 四、实验程序编写五、编译下载验证 一、前言 汇编语言编写 LED 灯实验&#xff0c;但是实际开发过程中汇…

Go语言的内存泄漏如何检测和避免?

文章目录 Go语言内存泄漏的检测与避免一、内存泄漏的检测1. 使用性能分析工具2. 使用内存泄漏检测工具3. 代码审查与测试 二、内存泄漏的避免1. 使用defer关键字2. 使用垃圾回收机制3. 避免循环引用4. 使用缓冲池 Go语言内存泄漏的检测与避免 在Go语言开发中&#xff0c;内存泄…

【已解决】C#设置Halcon显示区域Region的颜色

前言 在开发过程中&#xff0c;突然发现我需要显示的筛选区域的颜色是白色的&#xff0c;如下图示&#xff0c;这对我们来说不明显会导致我的二值化筛选的时候存在误差&#xff0c;因此我们需要更换成红色显示这样的话就可以更加的明显&#xff0c;二值化筛选更加的准确。 解…

java: 无法访问org.springframework.ldap.core.LdapTemplate

完整错误&#xff1a; java: 无法访问org.springframework.ldap.core.LdapTemplate错误的类文件: /E:/apache-maven-3.6.3/repository/org/springframework/ldap/spring-ldap-core/3.2.3/spring-ldap-core-3.2.3.jar!/org/springframework/ldap/core/LdapTemplate.class类文件具…

《2024年中国机器人行业投融资报告》| 附下载

近年来&#xff0c;国内机器人行业取得了显著的技术进步&#xff0c;包括人工智能、感知技术、自主导航等技术方面的突破&#xff0c;使得机器人能够更好地适应复杂环境和任务需求&#xff0c;带动了机器人行业加快发展。 当然&#xff0c;技术的进步是外在驱动因素&#xff0…

深入探索微软Edge:新一代浏览器的演进与创新

在数字时代的浪潮中&#xff0c;浏览器已不再只是简单的网页访问工具&#xff0c;而是成为了连接信息、服务与用户之间的重要桥梁。微软Edge作为微软公司推出的一款全新的浏览器&#xff0c;不仅承载着微软在互联网领域的最新愿景&#xff0c;还融合了多项前沿技术&#xff0c;…

探索集合python(Set)的神秘面纱:它与字典有何不同?

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、集合&#xff08;Set&#xff09;与字典&#xff08;Dictionary&#xff09;的初识 1. …

L2-038 病毒溯源

详解代码 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 10010,M10010;int n; int h[N], e[M], ne[M], idx;//邻接表,h表示顶点&#xff0c;e表示当前边的终点&#xff0c;ne表示下一条边&#xff0c;idx当…

海外动态IP代理如何提高效率?

动态住宅IP代理之所以能够有效提升数据爬取的效率和准确性&#xff0c;主要归功于其提供的IP地址具有高度的匿名性和真实性。这些IP地址来自于真实的用户网络&#xff0c;因此相比于数据中心IP&#xff0c;它们更不容易被网站的安全系统标识为爬虫。此外&#xff0c;由于IP地址…

XSS 攻击

XSS(Cross site Scripting,跨站脚本攻击)&#xff0c;是指攻击者利用站点的漏洞&#xff0c;在表单提交时&#xff0c;在表单内容中加入一些恶意脚本&#xff0c;当其他正常用户浏览页面&#xff0c;而页面中刚好出现攻击者的恶意脚本时&#xff0c;脚本被执行&#xff0c;从而…

【vue-1】vue入门—创建一个vue应用

最近在闲暇时间想学习一下前端框架vue&#xff0c;主要参考以下两个学习资料。 官网 快速上手 | Vue.js b站学习视频 2.创建一个Vue3应用_哔哩哔哩_bilibili 一、创建一个vue3应用 <!DOCTYPE html> <html lang"en"> <head><meta charset&q…

NodeJS安装并生成Vue脚手架(保姆级)

文章目录 NodeJS下载配置环境变量Vue脚手架生成Vue脚手架创建项目Vue项目绑定git 更多相关内容可查看 NodeJS下载 下载地址&#xff1a;https://nodejs.org/en 下载的速度应该很快&#xff0c;下载完可以无脑安装&#xff0c;以下记得勾选即可 注意要记住自己的安装路径&…

【Linux】简单模拟C语言文件标准库FILE

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

Kaggle——First Machine Learning Model

kaggle&#xff08;需要魔法才能访问&#xff09;:https://www.kaggle.com/ 需要下载的数据集&#xff1a;melb_data.csv、train.csv&#xff08;已放在资源里面&#xff09; First Machine Learning Model Selecting Data for Modeling #Selecting Data for Modeling import…

C++ 学习 关于引用

&#x1f64b;本文主要讲讲C的引用 是基础入门篇~ 本文是阅读C Primer 第五版的笔记 &#x1f308; 关于引用 几个比较重要的点 &#x1f33f;引用相当于为一个已经存在的对象所起的另外一个名字 &#x1f31e; 定义引用时&#xff0c;程序把引用和它的初始值绑定&#xff08;b…