Spring Boot单元测试与热部署简析
1 Spring Boot的简介
Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的开发过程,提供了自动配置和默认配置,使得开发者只需专注于业务逻辑的实现,而不用去关注繁琐的配置问题。
Spring Boot具有以下特点:
-
简化配置:Spring Boot通过自动配置机制来减少配置的工作量。它会根据项目的依赖自动配置相关的组件,开发者只需要添加依赖和一些简单的配置即可。
-
快速开发:Spring Boot提供了一套完整的开发工具,包括代码生成器、热部署等,可以大大加快开发速度。
-
微服务支持:Spring Boot天生支持微服务架构,可以方便地构建和部署独立的微服务应用程序。
-
内嵌服务器:Spring Boot内嵌了常见的Web服务器(如Tomcat、Jetty等),可以以独立应用程序的形式运行,不需要额外安装Web服务器。
-
监控和管理:Spring Boot提供了丰富的监控和管理功能,可以方便地监控应用程序的运行状态和健康状况。
2 Spring Boot的单元测试以及热部署的相关知识
Spring Boot 提供了很好的支持来编写单元测试和实现热部署。下面我将简要介绍一下这两个方面的相关知识。
2.1 单元测试: Spring Boot 使用了JUnit作为默认的单元测试框架,可以通过注解@RunWith(SpringRunner.class)
来指定运行器,以便在测试过程中初始化Spring的应用上下文。 你可以使用@SpringBootTest
注解标注测试类,以便在测试期间初始化Spring Boot应用的完整上下文。 你还可以使用@MockBean
和@Mockito
等注解来模拟依赖的外部组件或服务。 另外,Spring Boot还提供了一些其他有用的注解,如@DataJpaTest
和@WebMvcTest
等,用于测试特定领域或Web层的代码。
以下是在Spring Boot中进行单元测试和相关部署的一些常用方法和技巧:
-
使用JUnit:JUnit是Java开发中最常用的单元测试框架之一。Spring Boot默认使用JUnit进行单元测试,可以使用
@RunWith(SpringRunner.class)
注解来启用Spring Boot的测试支持。可以使用@Test
注解来标记测试方法。 -
使用Mockito:Mockito是一个用于创建和管理模拟对象(mock objects)的Java库。在单元测试中,我们可以使用Mockito来模拟一些外部依赖,以便更好地控制测试环境。例如,我们可以使用Mockito来模拟数据库访问,而不是实际访问数据库。
-
使用Spring Boot Test:Spring Boot Test提供了一系列用于测试Spring Boot应用程序的注解和类。例如,
@SpringBootTest
注解可以用于加载整个应用程序上下文,并进行集成测试。@WebMvcTest
注解可以用于测试Web层的控制器。 -
使用测试配置文件:Spring Boot允许我们在单元测试中使用不同的配置文件,以便更好地控制测试环境。可以使用
@TestProperites
注解来指定测试配置文件的路径。在测试配置文件中,我们可以覆盖一些配置项,例如数据库连接、缓存配置等。 -
使用断言和断言库:在单元测试中,我们通常需要验证期望的结果与实际结果是否一致。可以使用JUnit的断言方法,如
assertEquals
和assertTrue
来进行验证。此外,还可以使用一些流行的断言库,如AssertJ和Hamcrest来提供更多的断言方法。 -
运行单元测试:在Spring Boot中,我们可以使用Maven或Gradle等构建工具来运行单元测试。可以使用
mvn test
或gradle test
命令来执行单元测试。
2.2 热部署: 在开发阶段,热部署可以使你的代码更快地重新部署和运行。Spring Boot支持两种类型的热部署:
- 通过使用
spring-boot-devtools
模块,你可以在应用启动时自动配置热部署。只需将该模块添加到依赖中即可,无需进行其他配置。 - 通过使用
spring-boot-maven-plugin
插件,你可以在代码改变时重新启动应用。只需在pom.xml文件中添加该插件的配置,并运行mvn spring-boot:run
命令即可。
-
另外,热部署还有一些其他的选项和配置方式,如使用Spring Loaded或JRebel等第三方工具。
以下是一些常用的热部署技巧和方法:
- 使用开发工具的自动重载功能:许多集成开发环境(IDE)和开发工具都提供了自动重载功能,可以自动监视代码的变化并重新加载应用程序。例如,Eclipse中的Spring Loaded插件、IntelliJ IDEA中的Spring Boot DevTools等。
- 使用Spring Boot的开发者工具(DevTools):Spring Boot DevTools提供了一套开发者工具,可以实现热部署和快速重新启动应用程序。它会监视应用程序的类文件和资源文件的变化,并在检测到变化时自动重新加载应用程序。
- 使用JRebel:JRebel是一个用于Java开发的工具,可以实现即时的代码热部署。它可以监视文件的变化,并将修改的类文件和资源文件重新加载到运行中的应用程序中,从而避免了重新启动应用程序。
- 使用Docker容器:将应用程序部署在Docker容器中,可以实现快速部署和更新。通过构建一个容器镜像并运行容器,可以在容器内部使用热部署技术来更新代码。修改后的容器镜像可以轻松地重新部署到生产环境中。
使用热部署插件:一些特定的框架和工具提供了热部署插件,可以用于在开发过程中实现热部署。例如,Spring Boot的Spring Loaded插件、JRebel的插件等。这些插件通常会提供自动监视和重新加载功能,从而实现快速开发和调试。
3 效果图
4 项目搭建步骤
在prom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.sbl</groupId><artifactId>MavenSBlnit</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.1.3.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency></dependencies></project>
在所创项目下的src.main.java的包下面建立controller包,并建立类HelloWporld
package com.sbl.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloWorld {@GetMapping("/hello")public String hello(){return "Hello World,i am 小孩 ";}
}
在原本创建的类下(及主项目)
package com.sbl;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class
MavenApplication {public static void main(String[] args){SpringApplication.run(MavenApplication.class,args);}
}
在test在Java文件下的包下建立test类
package com.sbl.chapter01sbinit;import com.sbl.controller.HelloWorld;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter01SbinitApplicationTests {@Autowiredprivate HelloWorld helloWorld;@Testpublic void contextLoads(){String hello= helloWorld.hello();System.out.println(hello);}
}
相关文章:

Spring Boot单元测试与热部署简析
1 Spring Boot的简介 Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的开发过程,提供了自动配置和默认配置,使得开发者只需专注于业务逻辑的实现,而不用去关注繁琐的配置问题。 Spring …...

3.12练习题解
1.台阶问题: 这道题目一看其实很容易想到可以用dp的板子去做,并且只需要用一维dp即可,其中dp的下标表示到达当前阶梯总共有多少种方法,由于结果有可能会很大所以一定要记得边记录边模,代码实现如下: #incl…...
Java中实现双向链表
一、目标 最近项目中实现双向链表,同时转为满二叉树。 二、代码 用java实现双向链表的代码如下: class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val x; } }public class FullBinaryTree {public TreeNode createTree(int[…...
【DevOps实战之k8s】使用Prometheus和Grafana监控K8S集群
【DevOps实战之k8s】使用Prometheus和Grafana监控K8S集群 目录 【DevOps实战之k8s】使用Prometheus和Grafana监控K8S集群系统架构Kubernetes集群指标抓取指标可视化警告PromQL示例按命名空间统计集群中的Pod数按命名空间重启Pod未就绪的PodCPU过度使用Memory过度使用健康的集群…...

【读论文】【精读】3D Gaussian Splatting for Real-Time Radiance Field Rendering
文章目录 1. What:2. Why:3. How:3.1 Real-time rendering3.2 Adaptive Control of Gaussians3.3 Differentiable 3D Gaussian splatting 4. Self-thoughts 1. What: What kind of thing is this article going to do (from the a…...

JVM理解学习
参考视频 JVM架构总览图 程序计数器 程序计数器,物理上用寄存器实现。 作用: 记住下一条JVM指令的执行地址 特点: 1 是线程私有的,随着线程的创建而创建,随着线程的消息而消息 2 是一小块内存 3 唯一不会内存溢出的地方…...

使用 Ruby 或 Python 在文件中查找
对于经常使用爬虫的我来说,在大多数文本编辑器都会有“在文件中查找”功能,主要是方便快捷的查找自己说需要的内容,那我有咩有可能用Ruby 或 Python实现类似的查找功能?这些功能又能怎么实现? 问题背景 许多流行的文本…...
python实现冒泡排序
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 以下是用Python实现冒泡排序的代…...
大数据开发(HBase面试真题-卷二)
大数据开发(HBase面试真题) 1、HBase读写数据流程?2、HBase的读写缓存?3、在删除HBase中的一个数据的时候,它什么时候真正的进行删除呢?4、HBase的一个region由哪些东西组成?5、HBase的rowkey为…...

基于springboot+vue的线上教育系统(源码+论文)
目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 现在大家的生活方式正在被计算机的发展慢慢改变着,学习方式也逐渐由书本走向荧幕,我认为这并不是不能避免的,但说实话,现在的生活方式与以往相比有太大的改变,人们的娱乐方式不仅仅…...
01-shell的自学课-基础变量学习
一、echo变量的一个坑 声明【临时变量】,然后打印出来;(拓展:env是linux的全局变量) [rootgong ~]# xinjizhiwashell [rootgong ~]# echo $xinjizhiwa shell [rootgong ~]# echo $xinjizhiwa-haha shell-haha [rootgo…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Span)
作为Text组件的子组件,用于显示行内文本的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件从API Version 10开始支持继承父组件Text的属性,即如果子组件未设置…...
前端框架的演进之路:从静态网页到现代交互体验的探索
前端框架的发展史 随着互联网的快速发展,前端技术也在不断进步,前端框架作为前端开发的重要工具,经历了从简单到复杂、从单一到多元的演变过程。本文将回顾前端框架的发展史,探讨其变迁背后的原因和趋势。 一、静态网页时代 在…...

在Linux/Ubuntu/Debian中设置字体
下载字体。 下载你喜欢的字体,双击并安装。 之后更新字体缓存: fc-cache -f -v安装 GNOME 调整。 GNOME Tweaks 是一个工具,允许你自定义 GNOME 桌面环境的各个方面,包括字体。 如果你还没有安装 GNOME Tweaks: …...
Python 常用内置函数,及实例演示
Python的内置函数非常强大,可以帮助你完成各种任务。以下是20个非常有用的Python内置函数及其使用实例: 1. abs() 返回数字的绝对值。 print(abs(-5)) # 输出:52. all() 如果迭代器的所有元素都为真(或迭代器为空)…...
C++标准输入输出和名字空间
C标准输入输出和名字空间 标准输入输出 在C中,标准输入输出(I/O)是通过标准库中的iostream库来实现的,它提供了一套流(stream)抽象来进行数据的输入和输出操作。这套流抽象包括输入流用于读取数据&#x…...
hive逗号分割行列转换
select * from ( select back_receipt_nos,order_no,reject_no from ods_oneplus.ods_us_wms_reject_order_match_all_d where order_no 10150501385980001 ) t1 lateral view explode(split(t1.back_receipt_nos, ,)) t as back_receipt_no where 1 1;...

Jenkins插件Parameterized Scheduler用法
Jenkins定时触发构建的同时设定参数。可以根据不同的定时构建器设置不同参数或环境变量的值。可以设置多个参数。并结合when控制stage流程的执行。结合when和triggeredBy区分定时构建的stage和手动执行的stage。 目录 什么是Parameterized Scheduler?如何配置实现呢…...
西门子S7.NET通信库【读】操作详解
在使用西门子PLC进行工业自动化控制的过程中,经常需要与PLC进行数据交换。S7.NET是一款广泛应用于.NET平台的西门子PLC通信库,它为开发者提供了一系列的API函数,以便在C#、VB.NET等.NET语言中轻松实现与西门子PLC的数据交互。本文将详细介绍如…...

Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等
一、前言 用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw,将这个原始的音频流保存到mp4文件是会…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...