• 0
  • 0
分享
  • 单元测试之mock使用——软件测试圈
  • quinn 2022-11-21 10:54:52 字数 2829 阅读 2202 收藏 0

一、简介

 一般程序中A类的m1方法调用B类的m2方法,而B类的m2方法又调用了C类的m3方法以此类推等等,而其中的某个方法的一些数据又需要调用其它服务或者查询数据库,一般单元测试只针对某个功能进行测试,但是如上面的情况在做单元测试时受程序结构、环境等条件限制就会变得非常复杂。mock可以模拟对象返回方式来解决与该单元功能不相关的依赖关系,即模拟B类的m2方法返回结果来进行A类的m1方法单元测试,排除受到B类C类等其它不相关因素的影响。

二、使用mock做单元测试的优点

1、效率高

就是跑Java代码,不需要启用Spring及连接数据库。

2、TDD(测试驱动开发)

即先编写单元测试用例,根据单元测试用例再编写程序代码。

3、并行开发

团队有多个开发人员时在把数据格式约定好后可使用mock模拟返回结果而不需等待功能开发完成后才能联调。

4、解决环境依赖问题

比如当网络不通、服务无法访问时也能进行单元测试。

三、mock实现原理

使用Stub(桩)技术动态的替换原程序功能。即在程序运行时将原本程序要调用class字节码的逻辑替换为mock代码。

四、mock使用

1、导入Maven依赖包

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.8.9</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.7.4</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>1.7.4</version>
    <scope>test</scope>
</dependency>

2、编写测试代码

2.1、模块接口调用代码

1.png

2.2、模块业务处理代码

2.png

 2.3、mock单元测试代码

/**
 * create with Daniel
 * Date: 2022/4/12
 **/
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
    //注入业务对象
    @InjectMocks
    private Service service;
    //使用Mock对象
    @Mock
    private FeignService feignService;
 
    /**
    * 测试方法
    * @author: Daniel
    * @date: 2022/4/12
    * @return void
    */
    @Test
    public void tester(){
        //初始化动作
        MockitoAnnotations.initMocks(this);
        Mockito.when(feignService.doApi(Mockito.anyString())).thenReturn("我是Mock对象");
        String result = service.doSomething("name");
        System.out.println(result);
    }
}

运行结果

3.png

从上图可以发现在Service调用Feign方法时返回的不是Feign的功能代码逻辑,而是返回测试用例中Mock返回的代码,这样可有效的解决单元测试用例对环境依赖的问题。

2.4、mock的其它用法

        //方法多次调用返回不同的值
        Mockito.when(feignService.doApi(Mockito.anyString())).thenReturn("第一次调用").thenReturn("第二次调用");
        System.out.println(service.doSomething("name"));
        System.out.println(service.doSomething("name"));
        //Mock没有返回值方法
        Mockito.doNothing().when(feignService).noReturn();
        //模块异常情况
        Mockito.when(feignService.doApi(Mockito.anyString())).thenThrow(new RuntimeException("我是Mock异常"));
        try{
            service.doSomething("name");
        }catch (Exception e){
            System.out.println(e.getMessage());
        }

运行结果

4.png

3、PowerMock使用 

PowerMock主要用于模拟静态方法的调用。

3.1、增加工具测试类

5.png

3.2、Mock测试类调整

 在类上加以下二个注解

@RunWith(PowerMockRunner.class)
@PrepareForTest({MockUtils.class})

添加测试代码

@Test
    public void testStatic(){
        PowerMockito.mockStatic(MockUtils.class);
        PowerMockito.when(MockUtils.check(Mockito.any())).thenReturn(true);
        System.out.println(MockUtils.check(null));
        System.out.println(MockUtils.check(1));
        System.out.println(MockUtils.check(new Object()));
    }

运行结果

6.png

由些可见,无论传什么参数都永远返回True。 


作者:不甘于平凡的溃败

原文链接:https://blog.csdn.net/wohiusdashi/article/details/124085245

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   在实际性能测试中,我们经常会遇到对多支交易进行混合压测的情况,此时为了在测试环境中模拟生产中交易量分布,我们会根据生产上各交易的交易量占比来配置压测时各交易的用户数,一般情况会采用以下两种方法。  设置多个线程组  将不同的交易放到单独的线程组下,根据生产上各交易量占比按比例设置不同线程组的并发用户数量。  例如有A、B、C三支交易需要进行混合压测,生产上ABC三支交易交易量占比为1:2:3,则在同一个测试计划下设置三个线程组,分别添加一个取样器,三个线程组设置并发用户数为1、2、3(并发用户数按照交易占比进行设置,实际用户数大小参考业务实际情况),如下图所示。  这种方法适合服务器对以上...
            0 0 1179
            分享
          •   冒烟测试,刚进公司就接触到了。只是刚开始一直没有体会到冒烟的含义和精髓,一直以为是冒烟测试就是把待测产品的主要功能测试一下就行了。后面回想一下,不是那么回事的。  冒烟测试源自硬件行业,对一个硬件或者硬件组件改动后,直接给设备加电,看看设备会不会冒烟,没冒烟,就表示待测组件是通过了测试。  在软件开发过程中,一直有高内聚,低耦合这样的说法,各个功能模块之间的耦合还是存在的,因此一个功能的改动,还是会影响到其他功能模块。  因此在开发人员修复了先前测试中发现的bug后,想知道这个bug的修复是否会影响到其他功能模块,需要做的就是冒烟测试。  搞清楚冒烟测试的起源,冒烟测试的目的后,不难想到,...
            0 0 2461
            分享
          • 读者提问:阿常你好,想请教一下,面试时让简单介绍一下你最近参与的一个项目,怎么回答比较好 ?阿常回答:可参考如下格式:最近这段时间(X年X月~X年X月),我负责测试了 XX 项目,核心业务是 XX,面向的用户群体是 XX ,用户量在 XX 左右,团队 XX 人,XX 个 产品,XX 个 开发,XX 个 测试,前端使用的技术栈是 XX,后端使用的技术栈是 XX,测试使用的技术栈是 XX,我主要负责的工作是 接口 + 性能 ,涉及测试工具 XX 等等。阿常碎碎念:以上问答素材来源于知识星球 软件测试圈:为软件测试答疑解惑。看完今天的分享对...
            0 0 1257
            分享
          •   做Web自动化的小伙伴们都知道Selenium,可以全面模拟各种网页上的键盘、鼠标、事件。  Selenium虽好,但是定位并不容易,不论CSSselector,还是XPATH,学习曲线也还是有的。  有没有更简单的Web自动化测试工具?  Selenium不好学?那你可能需要的是Helium   有!老司机今天给大家介绍一个比Selenium更简单的自动化测试工具——Helium。  Helium是Python的一个类库,需要事先用pip方式安装。  pip install helium      确保Chrome或者FireFox浏览器已经安装。不需要配合...
            2 2 1969
            分享
          •   有消息称,拼多多总部将从中国迁至爱尔兰。据财联社报道,对此,拼多多相关负责人表示,该消息严重失实,纯属误读。“拼多多出生在上海,成长在中国,拼多多总部始终在中国上海,不会改变。”  据介绍,拼多多电商全球化业务 temu 出于在欧洲开展业务的需要,同时基于合规需求,选择爱尔兰都柏林为海外业务法律注册地。  拼多多日前向美国 SEC 递交 20-F 文件,文件显示,截至 2023 年 2 月 28 日,拼多多创始人黄峥持股为 26.5%,腾讯持股为 14.7%,拼多多合伙人集体持股为 7%。拼多多管理层一共持股为 1.2%。  查询相关数据获悉,拼多多 2020 年、2021 年、2022 ...
            0 0 1231
            分享
      • 51testing软件测试圈微信