一文教会你 Spring Boot中的热部署与单元测试(简单易懂,附源码实战)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一文教会你 Spring Boot中的热部署与单元测试(简单易懂,附源码实战)

需要源码请点赞关注收藏和私信博主

前言:热部署的简介和目的

在实际应用开发过程中、业务变化、代码错误等发生时,难免修改程序。为了正确运行出修改的结果,我们往往需要从重启应用,否则将不能看到修改后的效果,这一启动过程时非常浪费时间的,导致开发效率低,因此我们有必要学习Spring Boot开发的热部署,自动实现应用的重启和部署,大大提高 开发和调试效率。

开发热部署的目的是使应用自动 重启和部署,提高开发效率

一、模板引擎的热部署

在Spring Boot应用中,使用模板引擎的页面默认使开启缓存的,如果修改了页面内容,则刷新页面是得不到修改后的页面的效果的。因此可以在配置文件application.properties中关闭模板引擎的缓存

spring.thymeleaf.cache=false 关闭Thymeleaf的缓存

spring.freemarker.cache=false 关闭FreeMarker的缓存

spring.groovy.template.cache=false 关闭Groovy的缓存

二、使用spring-boot-devtools进行热部署

在Spring Boot应用的pom.xml文件中添加spring-boot-devtools依赖即可实现页面和代码的热部署,其最重要的功能是自动实现将修改的应用代码更新到最新的应用上。

1:创建Spring Boot Web应用ch9_1

2:添加spring-boot-devtools依赖

在pom.xml中添加如下代码

<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
-<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.ch</groupId>
<artifactId>ch9_1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ch9_1</name>
<description>Demo project for Spring Boot</description>
-<properties>
<java.version>11</java.version>
</properties>
-<dependencies>
-<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
-<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
-<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
<!-- MySQL8.x时,请使用8.x的连接器 -->
</dependency>
<!-- MyBatis-Spring,Spring Boot应用整合MyBatis框架的核心依赖配置 -->
-<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
-<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
-<build>
-<plugins>
-<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

3:创建控制器类

package com.ch.ch9_1;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestDevToolsController {
  @RequestMapping("/testDevTools")
  public String testDevTools() {
    return "test DevTools 222";
  }
}

4:运行 Ch91Application主类

然后修改testDevTools方法 改返回值 然后直接刷新页面即可发现结果已经修改 即完成了热部署

三、Spring Boot的单元测试

Spring Boot为测试提供 了一个名为spring-boot-starter-test的Starter 使用STS创建Spring Boot应用时将自动添加上述依赖。它主要提供了以下测试库

1:JNnit:标准的单元测试Java应用程序

2:Spring Test&Spring Boot Test:针对Spring Boot应用程序的单元测试

3:Mockito:Java mocking框架 用于模拟任何Spring 管理的Bean

4:AssertJ:一个流畅的assertion库

5:JSONassert:对JSON对象或JSON字符串断言的库

6:JsonPath:提供类似于Xpath那样的符号来获取JSON数据片段

下面分别通过使用@WebMvcTest和@SpringBootTest两种方式测试一个控制器方法是否满足测试用力

@WebMvcTest

1:创建Spring Boot Web应用ch9_2

2 3步代码可以参照我之前的博客 此处不表

2:修改pom.xml文件 添加mysql依赖

3:修改application.properties内容 配置数据库连接

4:创建持久化实体类

package com.ch.ch9_2.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "student_table")
/**解决No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor异常*/
@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
public class Student implements Serializable{
  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;//主键
  private String sno;
  private String sname;
  private String ssex;
  public Student() {
    super();
  }
  public Student(int id, String sno, String sname, String ssex) {
    super();
    this.id = id;
    this.sno = sno;
    this.sname = sname;
    this.ssex = ssex;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getSno() {
    return sno;
  }
  public void setSno(String sno) {
    this.sno = sno;
  }
  public String getSname() {
    return sname;
  }
  public void setSname(String sname) {
    this.sname = sname;
  }
  public String getSsex() {
    return ssex;
  }
  public void setSsex(String ssex) {
    this.ssex = ssex;
  }
}

5:创建数据访问层

package com.ch.ch9_2.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.ch.ch9_2.entity.Student;
public interface StudentRepository extends JpaRepository<Student, Integer>{
}

6:创建控制器

package com.ch.ch9_2.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ch.ch9_2.entity.Student;
import com.ch.ch9_2.repository.StudentRepository;
@RestController
@RequestMapping("/student")
public class StudentController {
  @Autowired
  private StudentRepository studentRepository;
  /**
   * 保存学生信息
   */
  @PostMapping("/save")
  public String save(@RequestBody Student student) {
    studentRepository.save(student);
    return "success";
  }
  /**
   * 根据id查询学生信息
   */
  @GetMapping("/getOne/{id}")
  public Student getOne(@PathVariable("id") int id){
    return studentRepository.getOne(id);
  }
}

7:创建测试用例

包括基于@WebMvcTest的测试用例WebMvcStudentController

基于@SpringBootTest的测试用例SpringBootTestStudentController

需要此处源码可点赞关注收藏后私信博主

相关文章
|
21天前
|
机器学习/深度学习 PyTorch 算法框架/工具
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
这篇文章介绍了如何使用PyTorch框架,结合CIFAR-10数据集,通过定义神经网络、损失函数和优化器,进行模型的训练和测试。
57 2
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
|
6天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
11天前
|
Java 测试技术 开发者
必学!Spring Boot 单元测试、Mock 与 TestContainer 的高效使用技巧
【10月更文挑战第18天】 在现代软件开发中,单元测试是保证代码质量的重要手段。Spring Boot提供了强大的测试支持,使得编写和运行测试变得更加简单和高效。本文将深入探讨Spring Boot的单元测试、Mock技术以及TestContainer的高效使用技巧,帮助开发者提升测试效率和代码质量。
77 2
|
21天前
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
498 1
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
21天前
|
PyTorch 算法框架/工具 计算机视觉
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
本文介绍了使用YOLOv4-Tiny进行目标检测的完整流程,包括模型介绍、代码下载、数据集处理、网络训练、预测和评估。
66 2
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
|
2天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
12 2
|
3天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
18 2
|
5天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
11天前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
49 6
|
14天前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
26 1