对Spring MVC接口进行Mock测试
文章插图
1. 前言在Java开发中接触的开发者大多数不太注重对接口的测试 , 结果在联调对接中出现各种问题 。 也有的使用Postman等工具进行测试 , 虽然在使用上没有什么问题 , 如果接口增加了权限测试起来就比较恶心了 。 所以建议在单元测试中测试接口 , 保证在交付前先自测接口的健壮性 。 今天就来分享一下胖哥在开发中是如何对Spring MVC接口进行测试的 。
在开始前请务必确认添加了Spring Boot Test相关的组件 , 在最新的版本中应该包含以下依赖:
本文是在Spring Boot 2.3.4.RELEASE下进行的 。
2. 单独测试控制层如果我们只需要对控制层接口(Controller)进行测试 , 且该接口不依赖@Service、@Component等注解声明的Spring Bean时 , 可以借助@WebMvcTest来启用只针对Web控制层的测试 , 例如
@WebMvcTest class CustomSpringInjectApplicationTests {@AutowiredMockMvc mockMvc;@SneakyThrows@Testvoid contextLoads() {mockMvc.perform(MockMvcRequestBuilders.get("/foo/map")).andExpect(ResultMatcher.matchAll(status().isOk(),content().contentType(MediaType.APPLICATION_JSON),jsonPath("$.test", Is.is("hello")))).andDo(MockMvcResultHandlers.print());} ? }
这种方式要快的多 , 它只加载了应用程序的一小部分 。 但是如果你涉及到服务层这种方式是不凑效的 , 我们就需要另一种方式了 。
3. 整体测试大多数Spring Boot下的接口测试是整体而又全面的测试 , 涉及到控制层、服务层、持久层等方方面面 , 所以需要加载比较完整的Spring Boot上下文 。 这时我们可以这样做 , 声明一个抽象的测试基类:
package cn.felord.custom; ? import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; ? ? /*** 测试基类 ,* @author felord.cn*/ @SpringBootTest @AutoConfigureMockMvc abstract class CustomSpringInjectApplicationTests {/*** The Mock mvc.*/@AutowiredMockMvc mockMvc;// 其它公共依赖和处理方法}
只有当@AutoConfigureMockMvc存在时MockMvc才会被注入Spring IoC 。
然后针对具体的控制层进行如下测试代码的编写:
package cn.felord.custom; ? import lombok.SneakyThrows; import org.hamcrest.core.Is; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultMatcher; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; ? import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; ? /*** 测试FooController.** @author felord.cn*/ public class FooTests extends CustomSpringInjectApplicationTests {/*** /foo/map接口测试.*/@SneakyThrows@Testvoid contextLoads() {mockMvc.perform(MockMvcRequestBuilders.get("/foo/map")).andExpect(ResultMatcher.matchAll(status().isOk(),content().contentType(MediaType.APPLICATION_JSON),jsonPath("$.test", Is.is("bar")))).andDo(MockMvcResultHandlers.print());} }
推荐阅读
- 脑机接口发展失控,人类或将成为变形金刚,马斯克也很无奈
- 375W喂不饱:技嘉给RTX 3080悄悄增加了一个供电接口
- 基于Spring+Angular9+MySQL开发平台
- 接口|DP接口不比HDMI差甚至还免费 为何电视厂商不用?
- 阿里达摩院发布2021十大科技趋势,人类有望借脑机接口超越生物学极限
- 不换接口、开放内存超频,11代酷睿平台更厚道了
- 银欣推出MS12金属移动硬盘盒:采用20Gbps USB-C接口
- 别不拿GateWay当回事,SpringCloud告诉你错了
- M.2接口竟然也能装显卡 4K无压力
- 为什么移动硬盘不建议插在台式机前置USB接口上?看完长知识了