测试私有(private)的方法有两种:

1)把目标类的私有方法(修饰符:private)修改为(public),不推荐,因为修改了源程序不佳

2)通过反射 (推荐

代码演示:

目标程序

PrivateMethod.java

  1. package com.junit3_8;
  2. public class PrivateMethod {
  3. //私有方法
  4. private int add(int a, int b)
  5. {
  6. return a +b ;
  7. }
  8. }

测试程序

PrivateMethodTest.java

  1. package com.junit3_8;
  2. import java.lang.reflect.Method;
  3. import junit.framework.Assert;
  4. import junit.framework.TestCase;
  5. /**
  6. * 通过反射测试私有方法,
  7. *
  8. */
  9. public class PrivateMethodTest extends TestCase {
  10. public void testAdd() throws Exception
  11. {
  12. //PrivateMethod pm = new PrivateMethod();
  13. //获取目标类的class对象
  14. Class<PrivateMethod> class1 = PrivateMethod.class;
  15. //获取目标类的实例
  16. Object instance = class1.newInstance();
  17. //getDeclaredMethod()  可获取 公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
  18. //getMethod() 只可获取公共的方法
  19. Method method = class1.getDeclaredMethod("add", new Class[]{int.class,int.class});
  20. //值为true时 反射的对象在使用时 应让一切已有的访问权限取消
  21. method.setAccessible(true);
  22. Object result = method.invoke(instance, new Object[]{1,2});
  23. Assert.assertEquals(3, result);
  24. }
  25. }

小结:

getDeclaredMethod()  可获取 公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 getMethod() 只可获取公共的方法

Method method = class1.getDeclaredMethod("add", new Class[]{int.class,int.class});

等价于

Method method = class1.getDeclaredMethod("add", new Class[]{Integer.TYPE,int.Integer.TYPE});

因为 Integer.TYPE 表示基本类型 int 的 Class 实例

JUnit 3.8 通过反射测试私有方法的更多相关文章

  1. [bug]spring项目通过反射测试私有方法时,注入对象异常

    背景 遇到问题:在进行Spring单元测试编写时,发现被测方法是一个私有方法,无法直接通过注入对象调用 解决思路:首先想到通过反射获取该私有方法的访问权限,并传入注入对象,最终调用对象的私有方法. 出 ...

  2. 无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类

    1.为什么要用mock 我的一本书的解释: (1)创建所需的DB数据可能需要很长时间,如:调用别的接口,模拟很多数据 (2)调用第三方API接口,测试很慢, (3)编写满足所有外部依赖的测试可能很复杂 ...

  3. java中用反射访问私有方法和私有成员[转]

    转自: http://zhouyangchenrui.iteye.com/blog/470521 java的反射可以绕过访问权限,访问到类的私有方法和成员.可能这点会引起安全性的讨论.反射的使用帮助解 ...

  4. Java 反射获取私有方法

    通常我们创建一个类时,它的私有方法在类外是不可见的,但是可以通过反射机制来获取调用.具体的反射机制的介绍大家自己百度. 所以反射可能会破坏我们的单例模式,当然解决方案也是有的,就是做个标记记录次数,第 ...

  5. c# 通过反射获取私有方法

    class Program { static void Main(string[] args) { //通过反射来调私有的成员 Type type = typeof(Person); //Bindin ...

  6. Java开发笔记(八十)利用反射技术操作私有方法

    前面介绍了如何利用反射技术读写私有属性,不单是私有属性,就连私有方法也能通过反射技术来调用.为了演示反射的逆天功能,首先给Chicken鸡类增加下列几个私有方法,简单起见弄来了set***/get** ...

  7. 使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等,以及方法执行的坑或者模拟不成功解决

    依赖:这个很重要,不同版本用法也有点区别: <dependency> <groupId>org.mockito</groupId> <artifactId&g ...

  8. java反射调用私有方法和修改私有属性

    //调用私有方法package com.java.test; public class PrivateMethod { private String sayHello(String name) { r ...

  9. junit单元测试中私有方法测试

    1.单元测试可以对系统逻辑进行每个单元模块的测试. 2.单元测试也可以作为回归测试的依据,可以避免升级完善功能时引入问题. 3.单元测试要求将代码写的更清晰,更易于测试. 4.有时单元测试需要测试私有 ...

随机推荐

  1. BZOJ4552 HEOI2016排序

    太棒了!思路很不错. 没想到HEOID1三道线段树. 这题我们可以二分答案,将小于他的在线段树中设成0,大于他的设成1然后模拟操作复杂度O(mlog^2n) By:大奕哥 #include<bi ...

  2. Java实现-每天三道剑指Offre(2-4)

    实现一个单例模式 /** * 面试题2:实现单例模式 * * @author qiuyong 饿汉式 */ public class Singleton01 { private Singleton01 ...

  3. H2数据库使用 详解

    H2最完整的资料下载地址: http://download.csdn.net/detail/yixiaoping/5956595 H2数据库使用   H2数据库介绍 常用的开源数据库:H2,Derby ...

  4. MOSFET enhances voltage regulator's overcurrent protection

    The classic LM317 adjustable-output linear voltage regulator offers a relatively high, if package-de ...

  5. How to put a relative path for a DLL statically loaded?

    How to put a relative path for a DLL statically loaded? I have a DLL made in Delphi 7/Windows XP tha ...

  6. Android SDK Manager 代理服务器设置

    http://blog.csdn.net/star_splendid/article/details/6939063 自己机子更新的话,速度1KB/s 实在是等不及了~找方法吧 http://www. ...

  7. Step by Step 設定 TFS 2012 Create Team Project 權限 - 避免 TF218017、TF250044

    基本上權限的設定和 以往的 TFS 沒有什麼太大的差別 只是這次的權限設定畫面有略作些調整,我還是一併整理一下 當我們用 TFSSetup 的帳號安裝完 TFS 2012 後 想要在自已的電腦上用自已 ...

  8. 以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewControllers方法即可达到效果了

    以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewC ...

  9. jenkins使用slave报编码错误[WARNING] File encoding has not been set, using platform encoding ANSI_X3.4-1968, i.e. build is platform dependent!

    jenkins:master-slave 模式: master编码配置: slave编码配置: 可以看出master 和 slave的配置是一样的,但是当项目在slave上执行的时候,偶尔会报如下错误 ...

  10. ECMAScript新特性【一】--Object.create

    Object.create(prototype, descriptors) :创建一个具有指定原型且可选择性地包含指定属性的对象 参数: prototype 必需.  要用作原型的对象. 可以为 nu ...