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

posted @ 2020-12-16 11:11  moutory  阅读(56)  评论(0编辑  收藏  举报  来源