mockito学习笔记

前言

根据中文版mockito英文版mockito的教程学习笔记。
这里只有基础的一些,更深的目前没有用到,也就没写了,大家直接进链接看吧!

一、验证某些行为

一旦mock对象被创建了,mock对象会记住所有的交互。

    @Test
    @DisplayName("验证某些行为")
    void verifyBehavior() {
        //创建mockito对象
        List mockedList = mock(List.class);
        mockedList.add("one");
        mockedList.clear();
        //验证行为
        verify(mockedList).add("one");
        verify(mockedList).clear();
    }

二、测试桩

 @Test
 void stubbing() {
        List mock = mock(ArrayList.class); //默认情况下,所有的函数都有返回值。mock函数默认返回的是null,一个空的集合或者一个被对象类型包装的内置类型,例如0、false对应的对象类型为Integer、Boolean
        System.out.println(mock + "--" + mock.size()); //输出Mock for ArrayList, hashCode: 480490520--0
        mock.add(0, "win");
        when(mock.get(0)).thenReturn("first"); //一旦测试桩函数被调用,该函数将会一致返回固定的值
        System.out.println(mock.get(0)); //输出first
        when(mock.get(0)).thenReturn("first change");
        when(mock.get(1)).thenReturn(new IndexOutOfBoundsException());
        System.out.println(mock.get(0)); //输出second
        System.out.println(mock.get(1)); //输出java.lang.IndexOutOfBoundsException
        //get(2) 没有打桩
        System.out.println(mock.get(2)); //输出null
 }

三、参数匹配器

    @Test
    void argumentMatchers() {
        List mock = mock(ArrayList.class);
        when(mock.get(anyInt())).thenReturn("element");
        System.out.println(mock.get(10086));//输出element
    }

四、验证函数的调用次数

    @Test
    void verifyExactNumber() {
        List mockedList = mock(List.class);
        mockedList.add("once");
        mockedList.add("twice");
        mockedList.add("twice");
        verify(mockedList, times(1)).add("once"); //执行了一次
        verify(mockedList, times(2)).add("twice");//执行了两次
        verify(mockedList, never()).add("never");
        verify(mockedList,atLeastOnce()).add("twice");
        verify(mockedList,atLeast(2)).add("twice");
        verify(mockedList,atMost(2)).add("twice");
    }

五、抛出异常

    @Test
    void throwExceptions(){
        List mockedList = mock(List.class);
//        doThrow(new RuntimeException()).when(mockedList).clear();
        doThrow(new RuntimeException()).when(mockedList).contains(anyInt());
//        mockedList.clear(); //抛出java.lang.RuntimeException异常
        mockedList.contains(1); //抛出java.lang.RuntimeException异常
    }

六、确保交互操作不会执行在mock对象上

    @Test
    void makeSureInteractionsNeverHappened(){
        List mockedList = mock(List.class);
        List mockedList2 = mock(List.class);
        mockedList.addAll(mockedList2);
        verifyZeroInteractions(mockedList,mockedList2);//抛出org.mockito.exceptions.verification.NoInteractionsWanted异常
    }

七、验证执行顺序

 @Test
    void verificationInOrder(){
        List mockedList = mock(List.class);
        mockedList.add("first");
        mockedList.add("second");
        InOrder inOrder = inOrder(mockedList);
        inOrder.verify(mockedList).add("first");
        inOrder.verify(mockedList).add("second");

        List firstMockedList = mock(List.class);
        List secondMockedList = mock(List.class);
        firstMockedList.add("first");
        secondMockedList.add("first");
        InOrder multipleOrder = inOrder(firstMockedList, secondMockedList);
        multipleOrder.verify(firstMockedList).add("first");
        multipleOrder.verify(secondMockedList).add("first");
        verifyZeroInteractions(mockedList,firstMockedList,secondMockedList);
    }

八、查找冗余的调用

即验证传入的这些mock对象是否存在没有验证过的调用方法

    @Test
    void findRedundantInvocations() {
        List mockedList = mock(List.class);
        mockedList.add("one");
        verifyNoMoreInteractions(mockedList);//抛出org.mockito.exceptions.verification.NoInteractionsWanted异常
    }

verifyNoMoreInteractions()在交互测试套件中只是一个便利的验证,它的作用是当你需要验证是否存在冗余调用时。滥用它将导致测试代码的可维护性降低,所以不建议过于频繁的在每个测试方法中都使用。

九、简化mock对象的创建

    @Mock
    private ArrayList mockedList;
    @BeforeEach
    void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    @Test
    void verifyBehavior() {
        mockedList.add("one");
        verify(mockedList).add("one");
    }

十、为连续的调用做测试桩

    @Test
    void stubbingConsecutiveCalls(){
        when(mockedList.get(0)).thenReturn("first").thenReturn("second");
        //也可以这样写
        // when(mockedList.get(0)).thenReturn("first","second");
        System.out.println(mockedList.get(0)); //输出first
        System.out.println(mockedList.get(0)); //输出second
    }

等价于

doReturn("first","second").when(mockedList).get(0);
System.out.println(mockedList.get(0)); //输出first
System.out.println(mockedList.get(0)); //输出second

这两种方式还是有区别的,我们在十一条中讲。

十一、局部mocks(1.8.0+支持)

    @Test
    void realPartialMocks(){
        when(mockedList.get(10)).thenCallRealMethod(); //将会调用真实的方法
        System.out.println(mockedList.get(10));
    }

在一些罕见的情况下部分测试才会是易用的:处理不能轻易修改的代码(第三方接口,临时重构的遗留代码等等)。然而,为了新的,测试驱动和架构优秀的代码,我是不会使用部分测试的。

十二、重置mocks对象

        reset(mockedList);

十三、小技巧~模板代码

val eventLogicStub: EventLogic
    get() = mock(EventLogic::class.java).apply {

        doReturn(Observable.just(events))
                .`when`(this)
                .getEventsXX(anyString(), anyBoolean())

      doReturn(Single.just(events))
                .`when`(this)
                .getEventXX(anyString(), anyBoolean())

        doReturn(Single.just(files))
                .`when`(this)
                .getFilesXXX(anyString(), anyBoolean())

       doReturn(Maybe.just(files))
                .`when`(this)
                .getFileXX(anyString(), anyBoolean())
......
    }

这样子一个个重复劳动该怎么省去呢?用代码模板,我的是这样的:
输入dro,就可以得到如下的代码↓


自定义快捷输入

如何做?如何写?如下图


模板代码

如果你看到如下这样的提示,点击define,选择所在的组,例如我的是kotlin
文件,就选择kotlin啦


参考网址

Android Studio 模板用法与自定义模板

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容