• SpringBoot框架Mockito的使用


    SpringBoot框架Mockito的使用

    一、简介

    mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 在具体的测试过程中,我们经常会碰到需要模拟数据或者接口的情况,因为环境问题或者系统复杂度的问题,我们需要使用 Mock 方式进行数据的模拟。

    二、应用场景

    • 对象信息难构建:在测试过程中,需要第三方接口返回特定的数据以符合特定的测试场景,这种情况往往需要跨条线的沟通协调测试数据,成本高,效率低;利用Mock可以自定义返回测试结果,支持手动构造依赖接口的返回值。
    • 依赖的接口尚未开发完成:依赖接口性能参数无法保障。在对接口性能压测的时候,需要下游接口及时返回数据,满足上游接口的调用 频度。在依赖接口多的情况下,如何减轻工作量?
    • 异常场景(连接异常、超时异常等):当需要测试接口一些异常数据,接口正常情况是否无法提供异常数据的。那么如何简便地构造接口的异常数据

    三、使用

    Mockito框架是单元测试处理bean依赖注入的一大利器

    创建SpringBoot项目,版本为:2.3.7.RELEASE

    假设有两个服务分别是OrderService和UserService,OrderService的服务因为某种原因调用不了,而我们又要通过UserService来调用OrderService,又不想改变UserService方法里面的逻辑,我们可以通过Mockito模拟OrderService返回来的数据。

    创建OrderService和UserService接口

    public interface UserService {
        String getUser();
    }
    
    • 1
    • 2
    • 3
    public interface OrderService {
        String getOrder(Long id);
    }
    
    • 1
    • 2
    • 3
    @Service
    public class OrderServiceImpl implements OrderService {
        @Override
        public String getOrder(Long id){
            return id+"";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    创建UserServiceImpl实现,从实现里看出,需要调用OrderService里的getOrder方法,但是我们还没有这个方法的实现,或者有时候有实现调用不了

    @Service
    public class UserServiceImpl implements UserService {
        @Autowired
        private OrderService orderService;
    
        @Override
        public String getUser(){
            String order = orderService.getOrder(1L);
            return "name is zs,orderNum is"+order;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在测试类中写如下代码

    import cn.amoqi.cloud.mocktest.service.OrderService;
    import cn.amoqi.cloud.mocktest.service.UserService;
    import org.junit.jupiter.api.Test;
    import org.mockito.Mockito;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.boot.test.mock.mockito.MockBean;
    import org.springframework.util.Assert;
    import static org.mockito.ArgumentMatchers.any;
    
    @SpringBootTest
    class MockTestApplicationTests {
        @Autowired
        private UserService userService;
        @MockBean
        private OrderService orderService;
    
        @Test
        void contextLoads() {
            Mockito.when(orderService.getOrder(any(Long.class))).thenReturn("5");
            String user = userService.getUser();
            System.out.println(user);
            Assert.isTrue("name is zs,orderNum is5".equals(user),"用户信息不正确");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    执行测试方法,就会发现调用orderService.getOrder方法执行被替换成有结果的值 5了,我们并没有实现OrderService,也没有报错

  • 相关阅读:
    综合实验高级网络—— 配置三层 热备等网络技术
    JS函数调用方式
    限流设置之Nginx篇
    maven 依赖版本冲突异常
    Leetcode刷题详解——山脉数组的峰顶索引
    使用百度EasyDL实现明厨亮灶厨师帽识别
    Elasticsearch系列-安装部署
    解析java中的多线程的基本概念
    12 Synchronized与锁升级
    20220705图床搭建:阿里云OSS+PicGo + typora
  • 原文地址:https://blog.csdn.net/u011830181/article/details/127864848