上一节我们学习了使用Spring Boot编写第一个应用程序。当程序编写好后,我们可以选择使用浏览器来测试服务,也可以使用JUnit来测试Spring Boot。
如果你需要使用 JUnit 来测试 Spring Boot 应用,你需要额外做一些配置,如下:
(1)引入Spring Boot JUnit 测试 maven 依赖,如下:
<!-- Spring测试模块 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
(2)编写我们自己的 controller,代码如下:
package com.huangx.springboot;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello spring boot";
    }
}上面 controller 很简单,就一个 hello() 方法,且该方法返回“hello spring boot”字符串(请求地址为 /hello)。
(3)编写 Java 测试代码来测试 controller,如下:
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
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.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;
 
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloControllerTest {
    private MockMvc mvc;
 
    @Before
    public void setUp() throws Exception {
        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
    }
 
    @Test
    public void hello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/hello")
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
    }
}运行上面代码,就可以自动调用“/hello”接口。上面测试程序中用到了 MockMvc,该类是来自“spring-boot-starter-test”依赖包。实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,使得测试速度快、不依赖网络环境。同时提供了一套验证的工具,结果的验证十分方便。其中:
MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON):代码将获取一个请求构建对象 RequestBuilder
mvc.perform(...):方法将根据传递的 RequestBuilder 去调用接口
andExpect(MockMvcResultMatchers.status().isOk()):判断调用接口返回的状态码是否为 200
andDo(MockMvcResultHandlers.print()):执行一个动作,MockMvcResultHandlers.print() 将 MvcResult 细节打印到“标准”输出流。
.andReturn():返回请求执行的结果,以便直接访问结果
