单元测试之MockBean

上次介绍了如何调用本地接口的MockMvc,这次分享的是如何使用MockBean模拟第三方接口的返回值。使用的技术为Mockito。

项目中需要添加依赖:

testImplementation 'org.springframework.boot:spring-boot-starter-test'

1、创建被测试的SparkService

package com.spark.mock.service;

import org.springframework.stereotype.Service;

@Service
public class SparkService {

    /**
     * 一个参数
     * @param pattern
     * @return
     */
    public String getName(String pattern){
        // 此处可以写调用没有网络权限,或者第三方没有开发完成的接口
        return "测试成功";
    }

    /**
     * 多个参数
     * @param pattern1
     * @param pattern2
     * @return
     */
    public String getName(String pattern1,String pattern2){
        // 此处可以写调用没有网络权限,或者第三方没有开发完成的接口
        return "测试成功";
    }
}

2、创建Controller

	@PostMapping("/api/mockBean")
    public String getMock(){
        return sparkService.getName("wsl");
    }

    @PostMapping("/api/getMockMulParamters")
    public String getMockMulParamters(){
        return sparkService.getName("Spark","24");
    }

3、写单元测试类

在单元测试类中引入需要被模拟的接口SparkService,并在上面添加注解

@MockBean
private SparkService sparkService;

创建测试方法分别模拟一个参数、多个参数、抛出异常三种情况。主要使用的依赖以及实现方式

import org.springframework.boot.test.mock.mockito.MockBean
import static org.mockito.ArgumentMatchers.eq
import static org.mockito.Mockito.when
when(sparkService.getName(eq("wsl"))).thenReturn("此处为模拟单个接口参数的返回结果");

测试方法

@MockBean
private SparkService sparkService;


创建测试方法分别模拟一个参数、多个参数、抛出异常三种情况。主要使用的依赖以及实现方式

import org.springframework.boot.test.mock.mockito.MockBean
import static org.mockito.ArgumentMatchers.eq
import static org.mockito.Mockito.when
when(sparkService.getName(eq("wsl"))).thenReturn("此处为模拟单个接口参数的返回结果");
    /**
     * 模拟第三方接口的返回值
     * @throws Exception
     */
    @Test
    public void getMock() throws Exception {
        // 模拟接口的返回值  getName里面的参数满足条件可以自己设置
        when(sparkService.getName(eq("wsl"))).thenReturn("此处为模拟单个接口参数的返回结果");
        ResultActions perform = mvc.perform(post("/api/mockBean") // post方法 请求路径
                .contentType(MediaType.APPLICATION_JSON));
        perform.andReturn().getResponse().setCharacterEncoding("UTF-8"); // 解决response返回乱码
        perform.andDo(print()); // 打印返回的执行结果
    }



    /**
     * 模拟传递多个参数
     * @throws Exception
     */
    @Test
    public void getMockException() throws Exception {
        // 模拟接口的返回值  getName里面的参数满足条件可以自己设置
        when(sparkService.getName(eq("Spark"),eq("24"))).thenReturn("此处为多个接口参数模拟抛出的异常");
        ResultActions perform = mvc.perform(post("/api/getMockMulParamters") // post方法 请求路径
                .contentType(MediaType.APPLICATION_JSON));
        perform.andReturn().getResponse().setCharacterEncoding("UTF-8"); // 解决response返回乱码
        perform.andDo(print()); // 打印返回的执行结果
    }



    /**
     * 根据具体的参数 模拟抛出的异常
     * @throws Exception
     */
    @Test
    public void getMockMulParamters() throws Exception {
        // 模拟接口的返回值  getName里面的参数满足条件可以自己设置
        when(sparkService.getName(eq("Spark"),eq("24"))).thenThrow(new Exception("此处为多个接口参数模拟抛出的异常"));
        ResultActions perform = mvc.perform(post("/api/getMockMulParamters") // post方法 请求路径
                .contentType(MediaType.APPLICATION_JSON));
        perform.andReturn().getResponse().setCharacterEncoding("UTF-8"); // 解决response返回乱码
        perform.andDo(print()); // 打印返回的执行结果
    }

项目地址:https://gitee.com/goodwangboy/junit-test.git
上面介绍的方式可以帮助我们模拟未开发完成的接口,无权限的接口等等,不用等待接口提供方开发完成再去开发,大大提高开发效率。由于在开发过程中接口会出现发版,修改等不稳定的情况,使用这种MockBean的模拟接口调试开发方式,可以大大节省开发的调试时间。

欢迎关注公众号
单元测试之MockBean_第1张图片

你可能感兴趣的:(java,gradle,单元测试,java)