一分钟上手SpringBootTest

简介: 您好,我是码农飞哥,感谢您阅读本文!本文主要讲述如何在SpringBoot框架上进行单元测试。也就是使用SpringBootTest进行单元测试。

您好,我是码农飞哥,感谢您阅读本文!本文主要讲述如何在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能力。

引入依赖

<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功能

编写单元测试基类

@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 注解是为了回滚测试产生的数据。

MockHttpServletRequest 类为了模拟HttpServletRequest 对象,可以通过它来设置请求头,这在需要鉴权的接口测试中十分实用。

7.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。

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

参考

SpringBoot Test及注解详解

Spring Boot Test (二、注解详解)

MockMvc详解


相关文章
|
网络协议 ice
STUN, TURN, ICE介绍
STUN STUN协议为终端提供一种方式能够获知自己经过NAT映射后的地址,从而替代位于应用层中的私网地址,达到NAT穿透的目的。STUN协议是典型的Client-Server协议,各种具体应用通过嵌入STUN客户端与STUN Server端通讯来完成交互。
15918 1
|
Linux iOS开发 MacOS
brew - mac 下的 brew 切换为国内源
brew - mac 下的 brew 切换为国内源
6420 0
|
分布式计算 资源调度 Hadoop
HBase表数据的读、写操作与综合操作
HBase表数据的读、写操作与综合操作
391 0
|
存储 JSON 关系型数据库
基于GeoTools的GeoJson导入到PostGis实战
GeoJson是一种对各种地理数据结构进行编码的格式,基于json的地理空间信息数据交换格式。GeoJson对象可以用来表示几何,特征或者特征集合。支持地理点、线、面、多点、多线、多面及几何集合。GeoJson不是本文的重点,因此不再赘述。
2584 0
基于GeoTools的GeoJson导入到PostGis实战
|
缓存 前端开发 JavaScript
【面试题】金九银十,你准备好面试了吗? (30w字前端面试题总结)( React)
【面试题】金九银十,你准备好面试了吗? (30w字前端面试题总结)( React)
483 0
MyBatisPlus+PostGIS实现Geometry数据的通用读写
MyBatisPlus+PostGIS实现Geometry数据的通用读写
1367 0
|
供应链 Go 区块链
基于区块链技术实现供应链的全程可追溯性
基于区块链技术实现供应链的全程可追溯性
882 17
|
消息中间件 Java 编译器
面试官:说说Lambda表达式底层原理?
面试官:说说Lambda表达式底层原理?
267 3
面试官:说说Lambda表达式底层原理?
|
机器学习/深度学习 SQL 自然语言处理
深度学习之编程错误自动修复
基于深度学习的编程错误自动修复(Automated Code Repair Using Deep Learning)是一种利用深度学习技术自动检测、定位并修复代码中的错误的技术。它旨在减少开发者手动调试和修复代码的时间,并提高代码的质量和可靠性。
458 3
|
应用服务中间件 Linux nginx
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流
《FFmpeg开发实战》书中介绍了如何使用FFmpeg向网络推流,简单流媒体服务器MediaMTX不适用于复杂业务。nginx-rtmp是Nginx的RTMP模块,提供基本流媒体服务。要在Linux上集成rtmp,需从官方下载nginx和nginx-rtmp-module源码,解压后在nginx目录配置并添加rtmp模块,编译安装。配置nginx.conf启用RTMP服务,监听1935端口。使用ffmpeg推流测试,如能通过VLC播放,表明nginx-rtmp运行正常。更多详情见书本。
820 0
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流