欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java使用junit测试私有方法和私有属性,javajunit,在开发过程中很多类的私有

来源: javaer 分享于  点击 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);   }  } }
相关栏目:

用户点评