mockMvc构建web单元测试学习笔记

web应用本来需要依靠tomcat这个环境运行

现在用mockMvc是为了模拟这个web环境,简化测试

什么是mock(模拟)

模拟对象---mock object是以可控方式模拟真实对象行为的假对象,通过模拟输入数据,验证程序达到预期结果

为什么使用mock对象

因为真实对象过于复杂,无法在单元测试中使用,故采用模拟对象替代

如网络延迟,不可能在单元测试中直接搭建一个服务器,只需要mock模拟出场景就行

mockMvc

spring-test包提供,能够实现对于http请求的模拟,直接使用网络的形式,转换到Controller的调用,使得测试速度快,不依赖网络环境,同时提供了一套的验证工具

XML 复制代码
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

mockMvc对象能够和Junit5来mock模拟出来tomcat运行环境,帮助自动测试出来接口

例子1:日志输出测试

类中方法:

java 复制代码
@RequestMapping(value = "/logger",method = RequestMethod.GET)
    @ResponseBody
    public String testLogger() {
        Logger logger = LoggerFactory.getLogger(this.getClass());
        logger.debug("测试级别日志");
        return "SUCCESS";
    }

测试代码:

java 复制代码
@Resource
    private MockMvc mockMvc;
    @Test
    @DisplayName("加油站-自己重定义测试方法名")
    public void testMock1() throws Exception {
        //自动向/logger发起一个get请求->
        mockMvc.perform(MockMvcRequestBuilders.get("/logger"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.content().string("SUCCESS"))
                .andReturn();
    }

启动test,下面控制台显示的和实际上启动web应用是一致的,这个就是mock的模拟过程

实现:

端口号是随机的 ,原因是在注解@SpringBootTest上设置了

复制代码
webEnvironment =SpringBootTest.WebEnvironment.RANDOM_PORT(每次都是随机端口,防止端口占用)

控制台显示了请求和响应的详细信息,就像在浏览器的检查网络页面显示的一样

请求信息:

辅助描述信息:

响应:

若在测试类中新增一句预期为SUCCESS1,如下图与实际结果不符,测试就会爆红,并说明预期值和实际值各为多少

@DispayName注解可用于重新定义方法名

例子2:JSON响应测试用例

类中方法:

java 复制代码
 @RequestMapping(value = "/get_header",method = RequestMethod.GET)
    @ResponseBody
    public Map getHeader(@RequestHeader("token") String accessToken,String id){
        Map<String,Object> params=new HashMap<>();//返回的是Map映射对象,里面是json格式的
        params.put("access_token",accessToken);
        params.put("id",id);
        return params;
    }

测试代码:

java 复制代码
@Test
    @DisplayName("json响应测试用例")
    public void testMock2() throws Exception {
        //请求头设置,还有请求参数的设置
        mockMvc.perform(MockMvcRequestBuilders.get("/get_header")
                //设置请求头中access_token的信息
                .header("token","assssdq")
                //设置传入的参数id的值
                .param("id","891113"))
                //是否符合预期的响应isOK
                .andExpect(MockMvcResultMatchers.status().isOk())
                //响应的请求头的值是否和设置的请求头内的数据相等
                .andExpect(MockMvcResultMatchers.jsonPath("access_token").value("assssdq"))
                //将完整的响应过程,从请求到响应的各个参数的值都返回输出在控制台上
                .andDo(MockMvcResultHandlers.print())
                //结束请求并获得处理结果
                .andReturn();
    }

测试结果:

相关推荐
金銀銅鐵2 天前
浅解 JUnit 4 第十一篇:@Before 注解和 @After 注解如何发挥作用?
junit·单元测试
金銀銅鐵3 天前
浅解 JUnit 4 第十篇:方法上的 @Ignore 注解
junit·单元测试
阿狸猿5 天前
单元测试中静态测试、动态测试及白盒测试、回归测试实践
单元测试·软考
Max_uuc5 天前
【工程心法】从“在板盲调”到“云端验证”:嵌入式单元测试与 TDD 的工程化革命
单元测试·tdd
feathered-feathered6 天前
测试实战【用例设计】自己写的项目+功能测试(1)
java·服务器·后端·功能测试·jmeter·单元测试·压力测试
测试渣6 天前
持续集成中的自动化测试框架优化实战指南
python·ci/cd·单元测试·自动化·pytest
minh_coo7 天前
Spring单元测试之反射利器:ReflectionTestUtils
java·后端·spring·单元测试·intellij-idea
金銀銅鐵7 天前
浅解 JUnit 4 第九篇:JUnitCore (下)
junit·单元测试
A懿轩A8 天前
【Maven 构建工具】Maven + JUnit5 单元测试实战:测试级别、注解、断言与 Maven test 阶段
java·单元测试·maven