Spring Boot 单元测试(IDEA自动生成测试类、MockMvc)

一、IDEA自动生成测试类

1.安装插件JUnitGenerator V2.0

File---->Settings---->Browse Repositories

2.安装好后把JUnit和JUnitGenerator V2.0一起勾上

3.配置插件

把package上test.前缀去掉

配置测试类生成的地址

${SOURCEPATH}/../../test/java/${PACKAGE}/${FILENAME}

4.对着要生成的类

二、测试service类

package com.sid.service.impl;

import com.sid.service.UserService;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
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;
import static org.hamcrest.CoreMatchers.*;

import static org.junit.Assert.*;

/** 
* @Description: Service层单元测试  启动了服务
* @Param:  
* @return:  
* @Author: Sid
* @Date: 2018-10-24 13:53
* @since: 1.0
*/ 
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceImplTest {
    
    
    /** 
    * @Description: 直接测试service  用IOC注入进来  这样run的时候会先启动springboot项目 
    * @Param:  
    * @return:  
    * @Author: Sid
    * @Date: 2018-10-24 13:42
    * @since: 1.0
    */ 
    @Autowired
    UserService userService;

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void set() {
        userService.set("sid:test:string:key:","lalala");
        String value = userService.get("sid:test:string:key:");
        Assert.assertEquals("lalala",value);
        //可以只使用 assertThat 一个断言语句,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想
        //引入import static org.hamcrest.CoreMatchers.*;
        Assert.assertThat(value,is("lalala"));
    }

}

三、测试Controller类

有两种方法,1可以跟上面一样用@Autowired把Controller注入进来然后调用Controller的方法。参照上方,这里不介绍。

2.用MockMvc模拟完整的HTTP请求

package com.sid.controller;

import org.junit.After;
import org.junit.Before;
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.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
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 org.springframework.web.context.WebApplicationContext;
import static org.hamcrest.CoreMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;


/** 
* @Description: Controller层单元测试 注入Spring 上下文的环境到 MockMvc 中  测试时会启动项目
* @Param:  
* @return:  
* @Author: Sid
* @Date: 2018-10-24 13:45
* @since: 1.0
*/ 
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {

    /** 
    * @Description: 使用MockMvc 模拟HTTP请求 来测试controller
     * MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,
     * 这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
     *
     * // 模拟MVC对象,通过MockMvcBuilders.webAppContextSetup(this.wac).build()初始化。
    * @Param:  
    * @return:  
    * @Author: Sid
    * @Date: 2018-10-24 13:43
    * @since: 1.0
    */ 

    private MockMvc mvc;

    @Autowired
    private WebApplicationContext wac; // 注入WebApplicationContext

    /** 
    * @Description: 直接注入userController 然后调用userController的方法来测试
    * @Param:  
    * @return:  
    * @Author: Sid
    * @Date: 2018-10-24 13:44
    * @since: 1.0
    */ 
//    @Autowired
//    private UserController userController;

    @Before
    public void setUp() throws Exception {
        //使用 WebApplicationContext 构建 MockMvc
        this.mvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void addUser() throws Exception {
        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/user/add")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                //form表单格式传参
                .param("id", "4")
                .param("name", "junit test")
                .param("password", "111")
                .param("mobilePhone", "18523980000")
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE);

        ResultActions result = mvc.perform(requestBuilder);

        MvcResult mvcResult = result.andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();// 返回执行请求的结果

        System.out.println("response------------------:"+mvcResult.getResponse().getContentAsString());
    }

    @Test
    public void deleteUser() throws Exception {
        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/user/delete")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                //form表单格式传参
                .param("mobilePhone", "18523980000")
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE);

        ResultActions result = mvc.perform(requestBuilder);

        MvcResult mvcResult = result.andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$").value(1))
                .andDo(MockMvcResultHandlers.print())
                .andReturn();// 返回执行请求的结果

        System.out.println("response------------------:"+mvcResult.getResponse().getContentAsString());
    }

    @Test
    public void updateUser() throws Exception {
        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/user/update")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                //form表单格式传参
                .param("id", "1")
                .param("name", "李沂桀")
                .param("mobilePhone", "185")
                .param("password", "5")
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE);

        ResultActions result = mvc.perform(requestBuilder);

        MvcResult mvcResult = result.andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();// 返回执行请求的结果

        System.out.println("response------------------:"+mvcResult.getResponse().getContentAsString());
    }

    @Test
    public void selectAll() throws Exception {

        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/user/selectAll")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                //form表单格式传参
                .param("pageNum", "1")
                .param("pageSize", "5")
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE);

        ResultActions result = mvc.perform(requestBuilder);

        MvcResult mvcResult = result.andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(jsonPath("list").exists())
                .andExpect(jsonPath("$.list", notNullValue()))
                .andExpect(jsonPath("$.list[0].id", is(1)))
                .andDo(MockMvcResultHandlers.print())
                .andReturn();// 返回执行请求的结果

        System.out.println("response------------------:"+mvcResult.getResponse().getContentAsString());


    }

    @Test
    public void getUserByMobilePhone() throws Exception {

        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/user/getUserByMobilePhone")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                //form表单格式传参
                .param("mobilePhone", "18523980000")
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE);

        ResultActions result = mvc.perform(requestBuilder);

        MvcResult mvcResult = result.andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(jsonPath("$", notNullValue()))
                .andExpect(jsonPath("$.name", is("junit test")))
                .andDo(MockMvcResultHandlers.print())
                .andReturn();// 返回执行请求的结果

        System.out.println("response------------------:"+mvcResult.getResponse().getContentAsString());


    }


    @Test
    public void set() {
    }

    @Test
    public void get() {
    }
}