文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何mock当前类的私有方法

2023-09-01 05:55

关注

背景

基础知识

mockito单元测试:它的做法是mock掉当前类的所有外部依赖,保障自己的代码没有问题。举个例子,如果数据库查询的语句出了问题,单元测试不会测试出来。因为它直接mock掉了,不会去真的去查数据库。从这点来说,好像有点说不过去。但是吧,仅从代码的角度来说,又好像并没有什么问题。因为它目标是保障自己的代码正常,sql不算。再说除了单元测试,还测试用例不是。
编写单元测试的流程:写单元测试的时候,需要逐行分析代码。如果是外部依赖,那么mock掉它,自己模拟一个结果作为替代。否则继续分析下一行,直到代码结束。最后校验在指定的输入下,输出的结果是否符合预期。

为什么需要mock当前类的私有方法?

首先,当我们自动生成单元测试类的时候,它只会为我们创建公共方法的测试方法。
在这里插入图片描述
当被测试类的一个公共方法调用它的私有方法时,单元测试就需要为私有方法里面的内容,也进行逐行分析mock。特别的,如果有另一个公共方法也调用了这个私有方法,那个这个公共方法也需要做同样的事情。明显,从测试覆盖来说,这个私有方法已经被覆盖,没必要再逐行mock一次。这时候,如果能mock掉这个私有方法就好了,对吧!

举个例子

创建被测试类

调用的私有方法分为“有返回”和“没有返回”两种。分别创建了pubFunction1调用带返回的私有方法,pubFunction2调用不带返回的私有方法。

package com.aliyu.service.demo.mock;public class MockitoDemo {        public void pubFunction1(){        System.out.println("开始调用公共方法");        withoutReturn();        System.out.println("结束调用公共方法");    }        public void pubFunction2(){        System.out.println("开始调用公共方法");        withReturn();        System.out.println("结束调用公共方法");    }    private void withoutReturn(){        System.out.println("调用了'不带'返回的私有方法");    }    private String withReturn(){        System.out.println("调用了'带'返回的私有方法");        return "AAA";    }}

创建测试类

不带返回的私有方法mock

在这里插入图片描述
注:还需要注意的是,必须是junit4,否则会报错。在后面会提到。
完整代码如下:

package com.aliyu.service.demo.mock;import org.junit.Test;import org.junit.jupiter.api.BeforeEach;import org.junit.runner.RunWith;import org.mockito.InjectMocks;import org.mockito.MockitoAnnotations;import org.mockito.invocation.InvocationOnMock;import org.mockito.stubbing.Answer;import org.powermock.api.mockito.PowerMockito;import org.powermock.core.classloader.annotations.PrepareForTest;import org.powermock.modules.junit4.PowerMockRunner;@RunWith(PowerMockRunner.class)@PrepareForTest(MockitoDemo.class)public class MockitoDemoTest {    @InjectMocks    private MockitoDemo mockitoDemo;    @BeforeEach    public void setUp() throws Exception {        MockitoAnnotations.initMocks(this);    }        @Test    public void testPubFunction1() {        MockitoDemo mockitoDemo1 = PowerMockito.spy(mockitoDemo);        try {            PowerMockito.doNothing().when(mockitoDemo1,"withoutReturn");        } catch (Exception e) {            e.printStackTrace();        }        mockitoDemo1.pubFunction1();    }        @Test    public void testPubFunction3() {        MockitoDemo mockitoDemo1 = PowerMockito.spy(mockitoDemo);        try{            Answer answer=new Answer(){                public Object answer(InvocationOnMock invocationOnMock) throws Throwable{                    return null;                }            };            PowerMockito.doAnswer(answer).when(mockitoDemo1,"withoutReturn");        }catch(Exception e){            e.printStackTrace();        }        mockitoDemo1.pubFunction1();    }}

执行查看结果:
在这里插入图片描述
注:可以看到没有输出"调用了’不带’返回的私有方法"字样,说明已经成功mock。

带返回的私有方法mock

与不带返回的私有方法差别只在于mock时用的方法。
在这里插入图片描述
执行查看结果:
在这里插入图片描述
注:可以看到没有输出"调用了’带’返回的私有方法"字样,说明已经成功mock。

其他

如果用不是junit4,而是junit5会报错在这里插入图片描述

大致的意思就是公有方法没有返回值,不能打一个有返回值的桩。明明我是为有返回的私有方法打桩的咧。

带返回值时doReturn必须在前面,否则mock失败

在这里插入图片描述
注:就好像如果不行doReturn声明返回值的话,它就会先去执行一下私有方法。。

来源地址:https://blog.csdn.net/mofsfely2/article/details/128644239

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯