java使用junit测试私有方法和私有属性,javajunit,在开发过程中很多类的私有
分享于 点击 11391 次 点评:63
java使用junit测试私有方法和私有属性,javajunit,在开发过程中很多类的私有
在开发过程中很多类的私有属性和方法也是需要测试的,但是Junit并没有提供一种简单的测试私有方法。而Java中又没有C++那样的友元函数(friend)来实现私有属性和方法仅向测试类开放。我们怎么实现不改变被测代码,又能实现测试任务呢?Java中的反射技术可以帮我们实现这一构想。
先给出被测类:
package JunitTest;public class TestClass { public String pus = "This is a public String"; private String prs = "This is a private String"; public String getPublicString() { return pus; } private String getPrivateString() { return prs; } private String getName(String Name) { return "Your name is "+Name; } }
我们可以看到,被测类TestClass有一个私有变量prs,和两个私有方法。
首先我们实现访问私有类:
创建一个叫做TestGetPrivateString()
的TestCase
@Testpublic void TestGetPrivateString() throws IllegalArgumentException, IllegalAccessException { Field [] fa = TestClass.class.getDeclaredFields(); for(Field f :fa){ if(f.getName().equals("prs")) { f.setAccessible(true); TestClass t = new TestClass(); String prs = (String)(f.get(t)); System.out.println(prs); } } }
执行这个TestCase,我们会得到结果:
This is a private String
这里面的关键代码有3处
Field [] fa = TestClass.class.getDeclaredFields();
利用反射得到了所有变量的元数据数组。f.setAccessible(true);
改变访问属性String prs = (String)(f.get(t));
从类的实例中提取出field的内容。函数的使用方法可以参考:
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/Field.html
继续实现访问私有方法
其实和feild的方法及其类似只是需要调用Method方法而已。
给出代码:
@Test public void TestGetPM() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { Method [] ma = TestClass.class.getDeclaredMethods(); for(Method m :ma) { if(m.getName().equals("getName")) { m.setAccessible(true); TestClass t = new TestClass(); Object [] prams ={"Lucas"}; String s =(String)m.invoke(t,prams); System.out.println(s); } } }
用户点评