一分钟上手SpringBootTest

知识为进步之母,而进步又为富强之源泉。这篇文章主要讲述一分钟上手SpringBootTest相关的知识,希望能为你提供帮助。
您好,我是码农飞哥,感谢您阅读本文!本文主要讲述如何在SpringBoot框架上进行单元测试。也就是使用SpringBootTest进行单元测试。


文章目录

  • ??系统环境??
  • ??Spring Boot Test介绍??
  • ??引入依赖??
  • ??编写单元测试基类??
  • ??代码说明??
  • ??MockMvcRequestBuilders??
  • ??get请求测试??
  • ??post请求测试??
  • ??文件上传测试??
  • ??发送一个json格式的数据到Controller层??
  • ??总结??
  • ??参考??
系统环境
软件

版本

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能力。
引入依赖
< 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依赖,下面这些类库将被一同依赖进去:
  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功能
编写单元测试基类
@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;



代码说明
  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 方法是封装了公共的测试。 其中
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
  1. RequestBuilder是用来构建请求的。其提供了一个方法buildRequest(ServletContext servletContext) 用于构建MockHttpServletRequest; 其主要有两个子类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(文件上传时使用),即用来mock客户端请求需要的所有数据。
  2. 主要API有MockHttpServletRequestBuilder.get(String urlTemplate, Object… urlVariables): 根据uri模板和uri变量值得到一个GET请求方式的RequestBuilder,如果在controller的方法中method选择的是RequestMethod.GET,那在controllerTest中对应就要使用MockMvcRequestBuilders.get。
  3. MockHttpServletRequestBuilder.post(String urlTemplate, Object… urlVariables):同get类似,但是是post方法,通过param 方法来设置请求参数。
get请求测试
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/v1/works/lineup/set")
.param("id", "123")
.param("first_flag", String.valueOf(true));
String result = getMockResultStr(requestBuilder);

post请求测试
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);

发送一个json格式的数据到Controller层
String requestJson = JSONObject.toJSONString(folderInfo);
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("//v1/works/save").contentType(MediaType.APPLICATION_JSON).content(requestJson);

总结【一分钟上手SpringBootTest】本文详细介绍了SpringBootTest的使用,首先介绍了如何引入依赖,接着介绍了编写一个测试基类,并且对其中涉及的各个注解做了一个详细说明。最后就是罗列了各种测试情况。
参考??SpringBoot Test及注解详解????Spring Boot Test (二、注解详解)????MockMvc详解??



    推荐阅读