JMockit Mock 私有方法和私有属性

时间 2014-02-03 15:02:39   隔叶黄莺Unmi Blog 原文  http://unmi.cc/jmockit-mock-private-methods-fields/

前面说过 JMockit 因身处前线,所以简直无不可,本节例子演示 JMockit 怎么 Mock 私有方法和私有属性,示例虽然是静态方法和属性,但因采用的是反射手法,所以这种 Deencapsulation 的 Mock 手段同样适用于公有的方法或属性,无论是否静态。

本文所用 JMockit 版本为 1.6, 可能网上所搜索的方法与此有所不同,请注意 JMockit 版本差异。仍需重复一下,运行 JMockit 的例子 classpath 上必须让 jmockit.jar 在 junit.jar 之前,或用 javaagent 参数来加载 jmockit.jar,并且 junit 要 4.8 及以上版本.

1. Mock 私有方法(非静态类似)

package cc.unmi;public class MyService {public static String fetchData(String name){System.out.println("call MyService.fetchData");return fetchDataFromDB(name);}private static String fetchDataFromDB(String name){throw new RuntimeException("Not implemented yet!");}
}

fetchDataFromDB 是私有静态方法,正常测试的话肯定不过

package cc.unmi;import mockit.Deencapsulation;
import mockit.Expectations;import org.junit.Assert;
import org.junit.Test;public class MyServiceTest {@Testpublic void testFetchData() {new Expectations(MyService.class) {{Deencapsulation.invoke(MyService.class, "fetchDataFromDB", "Unmi");result = "http://unmi.cc";}};String actual = MyService.fetchData("Unmi");Assert.assertEquals("http://unmi.cc", actual);}
}

这行

Deencapsulation.invoke(MyService.class, "fetchDataFromDB", "Unmi");

使用了反射的方式拦截了 MyService 的 fetchDataFromDB 方法,并非强设了它的返回值为  “http://unmi.cc”。关键是调用了 Deencapsulation.invoke() 方法,来看到这个类里还有哪些方法:

看到上图,我们必须要产生一些想法的,特别是 invoke 和 setField,以及它们的第一个参数可以是 Class,也可以是 Object,不难获知的是我们能够借助于它来 Mocket 私有方法和属性,不论它们是静态还是非静态的。

上面的测试用例可以见绿,输出为:

call MyService.fetchData

本文原始链接 http://unmi.cc/jmockit-mock-private-methods-fields/ , 来自隔叶黄莺 Unmi Blog

如果把测试代码中的调用处改为

String actual = MyService.fetchData("Unmis");

测试将会失败:

java.lang.RuntimeException: Not implemented yet! 
    at cc.unmi.MyService.fetchDataFromDB(MyService.java:10) 
    at cc.unmi.MyService.fetchData(MyService.java:6) 
    at cc.unmi.MyServiceTest.testFetchData(MyServiceTest.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    ................

对了,就是反射。受上面的点拨,怎么 Mock 属性已了然于心了,再行累述纯为拉长篇幅,不妨

2. Mock 私有属性(静态亦类似)

package cc.unmi;public class MyService {private String url = "";public String fetchData(String name){System.out.println("call MyService.fetchData");return this.url;}
}

欲 Mock 的是 url 属性,从 fetchData 方法的 return url 可以检测到 Mock 后的值

package cc.unmi;import mockit.Deencapsulation;
import mockit.Expectations;import org.junit.Assert;
import org.junit.Test;public class MyServiceTest {@Testpublic void testFetchData() {final MyService service = new MyService();new Expectations() {{Deencapsulation.setField(service, "url", "http://unmi.cc");}};String actual = service.fetchData("Unmi");Assert.assertEquals("http://unmi.cc", actual);}
}

断言成功,与 Mock 私有方法有所不同的是在 new Expectations() 的括号中可以留白了,也用不着设置 result 值了。

从资料上看 Deencapsulation 是后来引入的,原来好像是直接调用  Expectations 的 invoke, setField 方法来改变运行中的值。

记得当初我们用 @MockClass, @Mock, 再 Mockit.setUpMock() 三步曲来进行 Mock 操作,如今看来光 new Expectations() 这一招便可走遍天下。

本文链接 http://unmi.cc/jmockit-mock-private-methods-fields/ , 来自隔叶黄莺 Unmi Blog

JMockit Mock 私有方法和私有属性相关推荐

  1. java mock私有方法_JMockit Mock 私有方法和私有属性

    前面说过 JMockit 因身处前线,所以简直无不可,本节例子演示 JMockit 怎么 Mock 私有方法和私有属性,示例虽然是静态方法和属性,但因采用的是反射手法,所以这种 Deencapsula ...

  2. Python笔记 · 私有方法、私有属性 单下划线、双下划线

    首先,不同于其他编程语言,Python中不存在真正意义上的"私有方法/属性",Python中所胃的"私有方法"要么基于约定,要么基于编译期的改写(Name Ma ...

  3. java私有属性和私有方法_Java私有,受保护,公共和默认

    java私有属性和私有方法 您是Java程序员,所以您知道我在说什么. public修饰符使方法或字段可从应用程序中的任何位置访问. 那是简单的部分. 但是,您能告诉我protected和包私有的区别 ...

  4. 私有方法,私有属性在继承中的应用

    转载于:https://www.cnblogs.com/Smalllv/p/8890132.html

  5. 三. python面向对象(私有属性和私有方法 私有静态方法 私有类方法)

    一. 私有属性(封装) # 侠义 上的封装 面向对象的三大特性之一 # 属性 和 方法都隐藏起来 不让你看到 # 如果要让内部属性不被外部属性直接访问 在属性前加上两个下划线__ # 在python中 ...

  6. 传智播客python笔记_python传智播客笔记--第十天:隐藏属性,私有属性,私有方法,__del__方法,类的继承,类中方法的重写...

    封装,继承,多态 隐藏属性,私有属性,私有方法,__del__方法,类的继承,类中方法的重写 -**************************************************** ...

  7. Python学习10 内置属性 对象属性 类属性 私有属性 私有方法 对象方法 类方法 静态方法

    内置属性 创建类时系统自动创建的属性 # 内置属性:dir(对象),列出所有的内置属性 class Person(object):'''Person类1'''# Person类2__slots__ = ...

  8. Python类中的私有属性和私有方法

    Python类中的私有属性和私有方法 Python是面向对象的语言,在Python里一切皆对象,所以大部分情况下,我们都是通过类的方式来编程. 但是Python中的属性和方法在类的外部默认是可以访问的 ...

  9. Python私有属性与私有方法

    1. 场景定义 私有属性 是指在 Python 的面向对象开发过程中,对象的某些属性只想在对象的内部被使用,但不想在外部被访问到这些属性. 即:私有属性是对象不愿意公开的属性. 私有方法 是指在 Py ...

最新文章

  1. 启动elasticsearch命令_快速安装ElasticSearch
  2. python多线程爬虫界面_多线程网页爬虫 python 实现
  3. JAVA并发编程学习笔记之CAS操作
  4. ExtJS学习:MVC模式案例(三)
  5. vc 文本框 只显示下划线_Word手动添加下划线就out了?虚线、波浪线、双下划线一键搞定...
  6. 计算机与新闻业未来发展,计算机学院举办“智创未来,谈思维与职业发展”活动...
  7. mysql主从进行扩展_Mysql主从知识扩展部分1
  8. android触摸效果,Android UI实现单行文本水平触摸滑动效果
  9. 集中式 vs 分布式 版本控制
  10. python,web框架说明
  11. Unity3d十二 3d主要引擎名称Ogre Unreal Unity Gamebryo Bigworld
  12. 电梯plc的io分配_用PLC构成液体混合控制系统IO分配及梯形图编程
  13. cmd imp导入dmp文件_dmp文件导入抽取方法(示例代码)
  14. 快速实现大量数据匹配来电号码归属
  15. 【python基础知识学习(6)】面向对象编程
  16. 在vue 中 ,dom操作滚动条 scrollTop无效
  17. windows7蓝牙怎么打开_windows7系统玩游戏不能全屏怎么办?
  18. 语法树与抽象语法树(parse tree abstract syntax tree)
  19. Unix时间戳毫秒值解读
  20. 循环队列 C++ 实现

热门文章

  1. Mysql中find_in_set()函数与in()函数的用法
  2. 吉时利Keithley软件2600系列2601B|2602B|2604B|2606B NS-SourceMeter源表软件
  3. SAS语言与算法介绍
  4. 第一课:什么是树莓派
  5. 等保测评 安全计算坏境之linux操作系统
  6. cgo+gSoap+onvif学习总结:5、获取profileToken、rtsp流地址、快照地址及cgo程序signal SIGSEGV: segmentation violation解决方法
  7. 京东 appck 一键转换 cookie
  8. 程序员分级,一家之言,因为程序员之间也是区分非常大的。
  9. 无线模块在分布式数据采集中的应用
  10. python手机群控(adb命令)实现