上一节我们学习了使用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():返回请求执行的结果,以便直接访问结果