java 测试成员变量,通过Java反射测试类私有成员

在Java开发阶段,因为追求架构规范和遵循设计原则,所以要用private和protected修饰符去定义类的成员方法、变量、常量,这使得代码具封装性、内聚性等,但在测试阶段会造成一定的不便。通过Java的反射机制,便能很好地解决该问题。

####ReflectUtil.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; } } 

####ReflectUtilTest.java

 //...... /** * @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所修饰方法和属性的调用、取值、传值等读写操作,未破坏原始代码也能完成对私有成员的单元测试。需要特别注意的是,建议仅运用在测试场景,切莫图方便在生产环境发行的代码逻辑中也通过反射调用类私有成员,这样便破坏原有的类设计,产生不可预料的结果及污染体系结构造成后续难以维护。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值