SpringBoot的单元测试和热部署
前言
SpringBoot是spring项目的一个子工程,SpringBoot约定大于配置的方式的特性可以大大的减少开发人员繁琐的配置,也被越来越多的开发团队作为技术的选择。这篇文章将对SpringBoot的单元测试和热部署进行详细的介绍,希望能够给不熟悉SpringBoot单元测试步骤的小伙伴们一些参考。
先说一下文章的具体内容,使用的集成工具是IDEA,SpringBoot的单元测试将分为Service层和Controller层的测试。热部署的话,主要是通过IDEA的配置来实现。
一、SpringBoot单元测试
(一)Service层
1. 添加pom依赖
使用idea初始化Spring项目的时候,会默认带上单元测试的pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
或者在原有项目pom文件的基础上加入以下依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
2、创建单元用例
在需要单元测试的类上右键点击Generate
(或者alt + insert键)
勾选需要单元测试的方法
3、进行单元测试
这里的话,最重要的是要使用一个注解@SpringBootTest
。
这个注解有什么用呢?我们构建的测试用例其实只是一个单独的测试用例,也就是说是在springboot没有启动前的测试用例。而SpringBootTest注解可以给我们初始化我们所需要的项目的Bean。
其次,第二个注解是@RunWith
,作用是告诉java你这个类通过用什么运行环境运行,例如启动和创建spring的应用上下文。@RunWith是Junit4提供的注解,将Spring和Junit链接了起来。假如使用Junit5,不再需要使用@ExtendWith注解,@SpringBootTest和其它@*Test默认已经包含了该注解。
package com.xiaoming.demo.service.impl;
import com.xiaoming.demo.pojo.Admin;
import com.xiaoming.demo.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
@RunWith(SpringRunner.class)
@SpringBootTest
class UserServiceImplTest {
@Autowired
private UserService userService;
@Test
void insert() {
Admin admin = new Admin();
admin.setUsername("xiaoming");
admin.setPassword("123456");
userService.insert(admin);
}
}
执行测试用例后,可以看到数据库已经有对应的数据了
注意:测试用例上面也可以加上事务注解去进行测试,如果不想持久化成功的话,还可以加入@Rollback注解,代码跑通后直接回滚掉就行。
(二)Controller层的单元测试
Controller层的单元测试要相对Service层复杂一些,因为很多时候我们Controller层使用rest接口,要测试接口是否正常返回结果的话,需要模拟做一下请求操作。
这里的话使用mock
简单说下步骤,注解使用和Service单元测试一样,然后引入mockMvc,使用@Before初始化mockMvc后,在具体方法中设置好请求头等参数,最后打印出来
package com.xiaoming.demo.controller;
import org.junit.Before;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MockMvcBuilder;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
@RunWith(SpringRunner.class)
class UserControllerTest {
private MockMvc mockMvc;
@Autowired
private UserController userController;
@Before
void init(){
mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
}
@Test
void insertUser() throws Exception {
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/user/getUser")
.accept(MediaType.APPLICATION_JSON)//请求数据格式
.contentType(MediaType.APPLICATION_JSON)//接受所用数据格式
.param("id","2");
// 执行请求
ResultActions result = mockMvc.perform(requestBuilder);
//结果解析
result.andExpect(MockMvcResultMatchers.status().isOk()) // 执行状态
// .andExpect(MockMvcResultMatchers.jsonPath("name").value("张三")) //期望值
.andDo(MockMvcResultHandlers.print()) // 打印
.andReturn(); // 返回
}
}
打印出来的结果如下:
不需要太详细的信息的话就直接print对象就行啦
当然啦,也有开发人员习惯用postman去做请求,两者都行,但是个人觉得使用直接在代码里面单元会更加方便。
二、SpringBoot的热部署
在开发过程中,难免会需要频繁修改到代码,如果每次修改后都要重启idea才可以验证的话,会比较浪费时间,我们可以通过如下配置来实现springboot热部署的效果。
1、在setting配置开启静态文件自动编译
2、通过ctrl+shift+alt+/快捷键进入Registry ,勾选自动编译(动态)
3、添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
4、调整springboot项目热更新策略
顶部菜单- >Edit Configurations->SpringBoot插件->目标项目->勾选热更新
参考文章:
1、springboot怎么开启热部署
https://www.jianshu.com/p/f658fed35786
2、springboot单元测试
https://www.jianshu.com/p/f9e6e04d44c5