热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:jmockit中文网expectations入门

通过上面的例子,我们已经了解了Expectations的作用主要是用于录制。即录制类/对象的调用,返回值是什么。录制脚本规范

通过上面的例子,我们已经了解了Expectations的作用主要是用于录制。即录制类/对象的调用,返回值是什么。

录制脚本规范









1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19



new Expectations() {

    // 这是一个Expectations匿名内部类

    {

          // 这是这个内部类的初始化代码块,我们在这里写录制脚本,脚本的格式要遵循下面的约定

        //方法调用(可是类的静态方法调用,也可以是对象的非静态方法调用)

        //result赋值要紧跟在方法调用后面

        //...其它准备录制脚本的代码

        //方法调用

        //result赋值

    }

};

 

还可以再写new一个Expectations,只要出现在重放阶段之前均有效。

new Expectations() {

      

    {

         //...录制脚本

    }

};


Expectations主要有两种使用方式。


    1. 通过引用外部类的Mock对象(@Injectabe,@Mocked,@Capturing)来录制











1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24



//Expectations对外部类的mock对象进行录制

public class ExpectationsTest {

    @Mocked

    Calendar cal;

 

    @Test

    public void testRecordOutside() {

        new Expectations() {

            {

                // 对cal.get方法进行录制,并匹配参数 Calendar.YEAR

                cal.get(Calendar.YEAR);

                result = 2016;// 年份不再返回当前小时。而是返回2016年

                // 对cal.get方法进行录制,并匹配参数 Calendar.HOUR_OF_DAY

                cal.get(Calendar.HOUR_OF_DAY);

                result = 7;// 小时不再返回当前小时。而是返回早上7点钟

            }

        };

        Assert.assertTrue(cal.get(Calendar.YEAR) == 2016);

        Assert.assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 7);

        // 因为没有录制过,所以这里月份返回默认值 0

        Assert.assertTrue(cal.get(Calendar.DAY_OF_MONTH) == 0);

    }

 

}



在这个例子中,在Expectations匿名内部类的初始代码块中,我们可以对外部类的任意成员变量,方法进行调用。大大便利我们书写录制脚本。


  1. 通过构建函数注入类/对象来录制

    在上面的例子中,我们通过引用外部类的Mock对象(@Injectabe,@Mocked,@Capturing)来录制,可是无论是@Injectabe,@Mocked,@Capturing哪种Mock对象,都是对类的方法都mock了,可是有时候,我们只希望JMockit只mock类/对象的某一个方法。怎么办? 看下面的例子就明白啦。










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

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48



//通过Expectations对其构造函数mock对象进行录制

public class ExpectationsConstructorTest2 {

 

    // 把类传入Expectations的构造函数

    @Test

    public void testRecordConstrutctor1() {

        Calendar cal = Calendar.getInstance();

        // 把待Mock的类传入Expectations的构造函数,可以达到只mock类的部分行为的目的

        new Expectations(Calendar.class) {

            {

                // 只对get方法并且参数为Calendar.HOUR_OF_DAY进行录制

                cal.get(Calendar.HOUR_OF_DAY);

                result = 7;// 小时永远返回早上7点钟

            }

        };

        Calendar now = Calendar.getInstance();

        // 因为下面的调用mock过了,小时永远返回7点钟了

        Assert.assertTrue(now.get(Calendar.HOUR_OF_DAY) == 7);

        // 因为下面的调用没有mock过,所以方法的行为不受mock影响,

        Assert.assertTrue(now.get(Calendar.DAY_OF_MONTH) == (new Date()).getDate());

    }

 

    // 把对象传入Expectations的构造函数

    @Test

    public void testRecordConstrutctor2() {

        Calendar cal = Calendar.getInstance();

        // 把待Mock的对象传入Expectations的构造函数,可以达到只mock类的部分行为的目的,但只对这个对象影响

        new Expectations(cal) {

            {

                // 只对get方法并且参数为Calendar.HOUR_OF_DAY进行录制

                cal.get(Calendar.HOUR_OF_DAY);

                result = 7;// 小时永远返回早上7点钟

            }

        };

 

        // 因为下面的调用mock过了,小时永远返回7点钟了

        Assert.assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 7);

        // 因为下面的调用没有mock过,所以方法的行为不受mock影响,

        Assert.assertTrue(cal.get(Calendar.DAY_OF_MONTH) == (new Date()).getDate());

 

        // now是另一个对象,上面录制只对cal对象的影响,所以now的方法行为没有任何变化

        Calendar now = Calendar.getInstance();

        // 不受mock影响

        Assert.assertTrue(now.get(Calendar.HOUR_OF_DAY) == (new Date()).getHours());

        // 不受mock影响

        Assert.assertTrue(now.get(Calendar.DAY_OF_MONTH) == (new Date()).getDate());

    }

}



推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 标题: ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
author-avatar
不要破网名_329
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有