在Java开发阶段,因为追求架构规范和遵循设计原则,所以要用private和protected修饰符去定义类的成员方法、变量、常量,这使得代码具封装性、内聚性等,但在测试阶段会造成一定的不便。通过Java的反射机制,便能很好地解决该问题。
//...... /** * @author yumin * @since 2015-03-02 14:52 */ public class ReflectUtil { private ReflectUtil() { } //部份代码略 public static Object invokeMethod(Object object, String methodName, Class[] parameterTypes, Object[] args) { Object result = null; if (null != object) { try { Method method = getDeclaredMethod(object, methodName, parameterTypes); result = method.invoke(object, args); } catch (NoSuchMethodException e) { //...... } catch (IllegalAccessException e) { //...... } catch (InvocationTargetException e) { //...... } } return result; } public static Method getDeclaredMethod(Object object, String methodName, Class[] parameterTypes) throws NoSuchMethodException { Method method = null; if (null != object) { method = object.getClass().getDeclaredMethod(methodName, parameterTypes); method.setAccessible(true); } return method; } }
//...... /** * @author yumin * @since 2015-03-02 14:53 */ public class ReflectUtilTest { //部份代码略 @Test public void testInvokeMethod() throws Exception { String whatIsYourName = null; String howOldAreYou = null; String name = "yumin"; int age = 18; Person person = new Person(); whatIsYourName = (String) ReflectUtil.invokeMethod(person, "whatIsYourName", null, null); howOldAreYou = (String) ReflectUtil.invokeMethod(person, "howOldAreYou", new Class[]{int.class}, new Object[]{age}); Assert.assertEquals(Person.whatIsYourName + name, whatIsYourName); Assert.assertEquals(Person.howOldAreYou + age, howOldAreYou); } public class Person { public static final String whatIsYourName = "My name is "; public static final String howOldAreYou = "I'm "; private String name = "yumin"; // 姓名 public void setName(String name) { this.name = name; } private String whatIsYourName() { return whatIsYourName + name; } private String howOldAreYou(int age) { return howOldAreYou + age; } } }
可以看到通过Java反射机制,实现了对被private和protected所修饰方法和属性的调用、取值、传值等读写操作,未破坏原始代码也能完成对私有成员的单元测试。需要特别注意的是,建议仅运用在测试场景,切莫图方便在生产环境发行的代码逻辑中也通过反射调用类私有成员,这样便破坏原有的类设计,产生不可预料的结果及污染体系结构造成后续难以维护。
更详细代码请参见:https://github.com/wangym/java-common/
相关推荐
Java反射技术指的是在运行时动态地获取类的信息、调用对象的方法、操作类的属性等能力。通过反射,程序可以在运行时检查类、实例化对象、调用方法、获取和设置属性,甚至可以动态修改类的结构。 Java反射技术的核心...
HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个实例成员变量 invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用...
小拽在处理过程中通过反射改变方法权限,进行单测,分享一下,直接上代码。 简单被测试类 生成一个简单的被测试类,只有个private方法。 复制代码 代码如下: <?php/** * 崔小涣单测的基本模板。 * * @author ...
一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...
第 6 章 反射调用私有方法或JDK代理的方法 调用私有方法 访问私有变量 使用反射方式构造对象实例 第 7 章 在测试代码中使用Mock 静态mock,new MockUp的使用 mock构造函数和静态代码块 new MockUp和spring的...
Reflection [java] 反射 [ri'flekʃәn] script n.手写体,小型程序 [skript] serialized vt.序列化,串行化 ['siәriәlaiz]'(serializable adj.)(deserialize反序列化,反串行化) Socket [java] 网络套接字['sɒkit...
写一个单元测试类,命名方式:XxxTest(测试类没有main方法) 2. 导入包,Junit4包 选中项目,右键 => Build Path => Add Library => 选中Junit 选中Junit4 => finish 3. 在测试类中,设计测试方法,...
15.1.4 内部类与外部类之间的成员互访 324 15.1.5 内部类与外部类的预定义对象引用this 327 15.2 局部内部类 328 15.2.1 局部内部类的定义及创建 328 15.2.2 局部变量与局部内部类 329 15.2.3 静态方法中...
JMUT-Java方法单元测试-是一个软件包,可帮助确保类(公共和私有)中的所有方法都经过单元测试。 它是用Java编写的,并使用反射和动态类加载来达到目的。
11.1 覆写类成员和trait成员 269 11.2 尝试覆写final声明 272 11.3 覆写抽象方法和具体方法 272 11.4 覆写抽象字段和具体字段 274 11.5 覆写抽象类型 280 11.6 无须区分访问方法和字段:统一访问...
通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件...