您好,我是码农飞哥,感谢您阅读本文!本文主要讲述如何在SpringBoot框架上进行单元测试。也就是使用SpringBootTest进行单元测试。
软件 | 版本 |
---|---|
SpringBoot | 2.1.2.RELEASE |
spring-boot-starter-test | 2.1.2.RELEASE |
spring-test | 5.3.3 |
Spring Test与Junit等其它框架结合起来,提供了便捷高效的测试手段,而SpringBootTest 是在Spring Test之上的再次封装,增加了切片测试,增强了Mock能力。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
引入spring-boot-starter-test依赖,下面这些类库将被一同依赖进去:
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("dev")
@AutoConfigureMockMvc
@WebAppConfiguration
@Transactional
public
class
BaseControllerTest
{
@Autowired
private
MockHttpServletRequest mockHttpServletRequest;
@Autowired
private
MockMvc mockMvc;
@Before
public
void setUp()
{
mockHttpServletRequest.setAttribute("userId",
"123");
}
protected
String getMockResultStr(MockHttpServletRequestBuilder requestBuilder)
{
try
{
MvcResult mvcResult =
this.mockMvc
.perform(requestBuilder)
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
return response.getContentAsString();
}
catch
(Exception e)
{
e.printStackTrace();
return
null;
}
}
}
@RunWith(SpringRunner.class)
注解表明使用SpringRunner来运行测试用例。@RunWith 注解是Junit4提供的注解,将Spring和Junit链接了起来。@SpringBootTest
注解替换了SpringMVC中用到的 @ContextConfiguration
注解,目的是加载ApplicationContext,启动Spring容器。使用 @SpringBootTest
并没有像 @ContextConfiguration
一样显示指定location或classes属性,原因在于 @SpringBootTest
注解会自动检索程序的配置文件,检索的顺序是从当前包开始逐级向上查找被 @SpringBootApplication
或 @SpringBootConfiguration
注解的类@ActiveProfiles
注解是指定连接的环境。MockMvc
,加上这个注解之后就可以直接通过 @Autowired 注入 MockMvc
@WebAppConfiguration
注解声明为集成测试加载的ApplicationContext应该是WebApplicationContext。@Transactional
注解是为了回滚测试产生的数据。
MvcResult mvcResult =
this.mockMvc
.perform(requestBuilder)
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
andDo(MockMvcResultHandlers.print())
输出整个响应结果信息,可以在调试的时候使用。RequestBuilder是用来构建请求的。其提供了一个方法buildRequest(ServletContext servletContext) 用于构建MockHttpServletRequest;其主要有两个子类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(文件上传时使用),即用来mock客户端请求需要的所有数据,主要API:MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的RequestBuilder,如果在controller的方法中method选择的是RequestMethod.GET,那在controllerTest中对应就要使用MockMvcRequestBuilders.get。post(String urlTemplate, Object... urlVariables):同get类似,但是是POST方法;通过param 方法来设置请求参数。
MockHttpServletRequestBuilder requestBuilder =
MockMvcRequestBuilders.get("/v1/works/lineup/set")
.param("id",
"123")
.param("first_flag",
String.valueOf(true));
String result = getMockResultStr(requestBuilder);
MockHttpServletRequestBuilder requestBuilder =
MockMvcRequestBuilders.post("/v1/blockly/copy")
.param("id",
"1211");
success(requestBuilder);
File file =
new
File(RestArmWorksControllerTest.class.getClassLoader().getResource("20201102172053.png").toURI());
MockMultipartFile mockMultipartFile =
new
MockMultipartFile("file",
"20201102172053.png",
"",
new
FileInputStream(file));
MockMultipartHttpServletRequestBuilder servletRequestBuilder =
MockMvcRequestBuilders.multipart("/creation/fileUpload.do")
.file(mockMultipartFile);
String result = getMockResultStr(servletRequestBuilder);
String requestJson =
JSONObject.toJSONString(folderInfo);
MockHttpServletRequestBuilder requestBuilder =
MockMvcRequestBuilders.post("//v1/works/save").contentType(MediaType.APPLICATION_JSON).content(requestJson);
本文详细介绍了SpringBootTest的使用,首先介绍了如何引入依赖,接着介绍了编写一个测试基类,并且对其中涉及的各个注解做了一个详细说明。最后就是罗列了各种测试情况。
SpringBoot Test及注解详解Spring Boot Test (二、注解详解)MockMvc详解