前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一分钟上手SpringBootTest,单元测试如此简单

一分钟上手SpringBootTest,单元测试如此简单

作者头像
码农飞哥
发布2021-08-18 11:20:35
1.7K0
发布2021-08-18 11:20:35
举报
文章被收录于专栏:好好学习好好学习

您好,我是码农飞哥,感谢您阅读本文!本文主要讲述如何在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
复制
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-test</artifactId>
  4. <version>${spring.boot.version}</version>
  5. <scope>test</scope>
  6. </dependency>

引入spring-boot-starter-test依赖,下面这些类库将被一同依赖进去:

  1. Junit: java测试事实上的标准,默认依赖版本是4.12
  2. Spring Test 依赖: Spring 的测试支持
  3. AssertJ: 提供了流式的断言方式
  4. Hamcrest: 提供了丰富的matcher
  5. Mockito: mock框架,可以按类型创建mock对象,可以根据方法参数指定特定的响应,也支持对于mock调用过程的断言。
  6. JSONassert: 为JSON提供了断言功能
  7. JsonPath: 为JSON提供了XPATH功能

编写单元测试基类

代码语言:javascript
复制
  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. @ActiveProfiles("dev")
  4. @AutoConfigureMockMvc
  5. @WebAppConfiguration
  6. @Transactional
  7. public class BaseControllerTest {
  8. @Autowired
  9. private MockHttpServletRequest mockHttpServletRequest;
  10. @Autowired
  11. private MockMvc mockMvc;
  12. @Before
  13. public void setUp() {
  14. mockHttpServletRequest.setAttribute("userId", "123");
  15. }
  16. protected String getMockResultStr(MockHttpServletRequestBuilder requestBuilder) {
  17. try {
  18. MvcResult mvcResult = this.mockMvc
  19. .perform(requestBuilder)
  20. .andExpect(status().isOk())
  21. .andDo(MockMvcResultHandlers.print())
  22. .andReturn();
  23. MockHttpServletResponse response = mvcResult.getResponse();
  24. response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
  25. return response.getContentAsString();
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. return null;
  29. }
  30. }
  31. }

代码说明

  1. @RunWith(SpringRunner.class) 注解表明使用SpringRunner来运行测试用例。@RunWith 注解是Junit4提供的注解,将Spring和Junit链接了起来。
  2. @SpringBootTest 注解替换了SpringMVC中用到的 @ContextConfiguration注解,目的是加载ApplicationContext,启动Spring容器。使用 @SpringBootTest并没有像 @ContextConfiguration一样显示指定location或classes属性,原因在于 @SpringBootTest注解会自动检索程序的配置文件,检索的顺序是从当前包开始逐级向上查找被 @SpringBootApplication@SpringBootConfiguration注解的类
  3. @ActiveProfiles 注解是指定连接的环境。
  4. @AutoConfigureMockMvc 注解是用于自动配置 MockMvc,加上这个注解之后就可以直接通过 @Autowired 注入 MockMvc
  5. @WebAppConfiguration 注解声明为集成测试加载的ApplicationContext应该是WebApplicationContext。
  6. @Transactional 注解是为了回滚测试产生的数据。
  7. MockHttpServletRequest 类为了模拟HttpServletRequest 对象,可以通过它来设置请求头,这在需要鉴权的接口测试中十分实用。
  8. MockMvc 实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快,不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。getMockResultStr 方法是封装了公共的测试。其中
代码语言:javascript
复制
  1. MvcResult mvcResult = this.mockMvc
  2. .perform(requestBuilder)
  3. .andExpect(status().isOk())
  4. .andDo(MockMvcResultHandlers.print())
  5. .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
复制
  1. MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/v1/works/lineup/set")
  2. .param("id", "123")
  3. .param("first_flag", String.valueOf(true));
  4. String result = getMockResultStr(requestBuilder);

post请求测试

代码语言:javascript
复制
  1. MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/v1/blockly/copy")
  2. .param("id", "1211");
  3. success(requestBuilder);

文件上传测试

代码语言:javascript
复制
  1. File file = new File(RestArmWorksControllerTest.class.getClassLoader().getResource("20201102172053.png").toURI());
  2. MockMultipartFile mockMultipartFile = new MockMultipartFile("file", "20201102172053.png", "", new FileInputStream(file));
  3. MockMultipartHttpServletRequestBuilder servletRequestBuilder = MockMvcRequestBuilders.multipart("/creation/fileUpload.do")
  4. .file(mockMultipartFile);
  5. String result = getMockResultStr(servletRequestBuilder);

发送一个json格式的数据到Controller层

代码语言:javascript
复制
  1. String requestJson = JSONObject.toJSONString(folderInfo);
  2. MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("//v1/works/save").contentType(MediaType.APPLICATION_JSON).content(requestJson);

总结

本文详细介绍了SpringBootTest的使用,首先介绍了如何引入依赖,接着介绍了编写一个测试基类,并且对其中涉及的各个注解做了一个详细说明。最后就是罗列了各种测试情况。

参考

SpringBoot Test及注解详解Spring Boot Test (二、注解详解)MockMvc详解

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农飞哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 系统环境
  • Spring Boot Test介绍
  • 引入依赖
  • 编写单元测试基类
    • 代码说明
    • MockMvcRequestBuilders
      • get请求测试
        • post请求测试
          • 文件上传测试
            • 发送一个json格式的数据到Controller层
            • 总结
            • 参考
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档