
您好,我是码农飞哥,感谢您阅读本文!本文主要讲述如何在SpringBoot框架上进行单元测试。也就是使用SpringBootTest进行单元测试。
系统环境
软件 | 版本 |
|---|---|
SpringBoot | 2.1.2.RELEASE |
spring-boot-starter-test | 2.1.2.RELEASE |
spring-test | 5.3.3 |
Spring Boot Test介绍
Spring Test与Junit等其它框架结合起来,提供了便捷高效的测试手段,而SpringBootTest 是在Spring Test之上的再次封装,增加了切片测试,增强了Mock能力。
引入依赖
代码语言:javascript复制-
<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依赖,下面这些类库将被一同依赖进去:
- Junit: java测试事实上的标准,默认依赖版本是4.12
- Spring Test 依赖: Spring 的测试支持
- AssertJ: 提供了流式的断言方式
- Hamcrest: 提供了丰富的matcher
- Mockito: mock框架,可以按类型创建mock对象,可以根据方法参数指定特定的响应,也支持对于mock调用过程的断言。
- JSONassert: 为JSON提供了断言功能
- JsonPath: 为JSON提供了XPATH功能
编写单元测试基类
代码语言:javascript复制@RunWith(SpringRunner.class)@SpringBootTest@ActiveProfiles("dev")@AutoConfigureMockMvc@WebAppConfiguration@TransactionalpublicclassBaseControllerTest{-
@Autowired -
privateMockHttpServletRequest mockHttpServletRequest; -
@Autowired -
privateMockMvc mockMvc; -
@Before -
publicvoid setUp(){ mockHttpServletRequest.setAttribute("userId","123");-
} -
protectedString 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();-
returnnull; -
} -
} }
代码说明
@RunWith(SpringRunner.class)注解表明使用SpringRunner来运行测试用例。@RunWith 注解是Junit4提供的注解,将Spring和Junit链接了起来。@SpringBootTest注解替换了SpringMVC中用到的@ContextConfiguration注解,目的是加载ApplicationContext,启动Spring容器。使用@SpringBootTest并没有像@ContextConfiguration一样显示指定location或classes属性,原因在于@SpringBootTest注解会自动检索程序的配置文件,检索的顺序是从当前包开始逐级向上查找被@SpringBootApplication或@SpringBootConfiguration注解的类@ActiveProfiles注解是指定连接的环境。- @AutoConfigureMockMvc 注解是用于自动配置
MockMvc,加上这个注解之后就可以直接通过 @Autowired 注入MockMvc @WebAppConfiguration注解声明为集成测试加载的ApplicationContext应该是WebApplicationContext。@Transactional注解是为了回滚测试产生的数据。- MockHttpServletRequest 类为了模拟HttpServletRequest 对象,可以通过它来设置请求头,这在需要鉴权的接口测试中十分实用。
- MockMvc 实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快,不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。getMockResultStr 方法是封装了公共的测试。其中
MvcResult mvcResult =this.mockMvc-
.perform(requestBuilder) -
.andExpect(status().isOk()) -
.andDo(MockMvcResultHandlers.print()) -
.andReturn();
- perform方法是执行一个RequestBuilder请求,调用Controller的业务处理逻辑。
- andExpect 方法是添加执行完成后的断言,添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确,此处是验证状态是否是200
- andDo 方法是添加一个结果处理器,比如在此处是
andDo(MockMvcResultHandlers.print())输出整个响应结果信息,可以在调试的时候使用。 - andReturn:方法是执行完成后返回相应的结果。
MockMvcRequestBuilders
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 方法来设置请求参数。
get请求测试
代码语言:javascript复制-
MockHttpServletRequestBuilder requestBuilder =MockMvcRequestBuilders.get("/v1/works/lineup/set") -
.param("id","123") -
.param("first_flag",String.valueOf(true)); -
String result = getMockResultStr(requestBuilder);
post请求测试
代码语言:javascript复制-
MockHttpServletRequestBuilder requestBuilder =MockMvcRequestBuilders.post("/v1/blockly/copy") -
.param("id","1211"); success(requestBuilder);
文件上传测试
代码语言:javascript复制-
File file =newFile(RestArmWorksControllerTest.class.getClassLoader().getResource("20201102172053.png").toURI()); -
MockMultipartFile mockMultipartFile =newMockMultipartFile("file","20201102172053.png","",newFileInputStream(file)); -
MockMultipartHttpServletRequestBuilder servletRequestBuilder =MockMvcRequestBuilders.multipart("/creation/fileUpload.do") -
.file(mockMultipartFile); -
String result = getMockResultStr(servletRequestBuilder);
发送一个json格式的数据到Controller层
代码语言:javascript复制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详解


