java测试private方法

引用:http://blog.csdn.net/badwps/article/details/1629990

当Java的类有一个方法的访问修饰符是private,我们在写测试类时该怎样对它进行测试吗?道难是先将它的修饰符改成public,然后在做完测试之后再将其改回public,其实完全不用这样做,我们在编写测试类的时候只要将其私有方法抽出,让其可以访问,就可以按要求进行测试了.

开始我们先写一个被测试类,如下:

package  com.srcopen.test;

public   class  Example ... {
 
private int add(int a,int b)...{
  
return a+b;
 }

 
 
public int doAdd(int c,int d)...{
  
return this.add(c, d);
 }

}

 

这个类非常的简单,它有一个相加的私有方法,进行a+b,然后在一个公有方法doAdd(int,int)中进行调用.下面让我们写一个简单的测试类对这个被测试类进行测试,如下:

package  com.srcopen.test;
import  junit.framework. * ;
public   class  Example_Test  extends  TestCase  ... {
    
public void testDoAdd() ...{
         Example example
=new Example();
         assertEquals(
4,example.doAdd(1,3));
    }

}

这对被测类的公有方法进行测试,应该是没问题的,然后对其私有方法进行测试,我们要想办法将其私有方法通过编程变成私有方法,主要用去Method这个类,将我们要测试的方法赋给它,其中它有一个设置,可使方法变成可进入,这样就可以达到测试的目的了,编写的完整代码如下:

package  com.srcopen.test;
import  junit.framework. * ;
import  java.lang.reflect.Method;
import  java.lang.reflect.InvocationTargetException;
public   class  Example_Test  extends  TestCase  ... {
    
public void testDoAdd() ...{
         Example example
=new Example();
         assertEquals(
4,example.doAdd(1,3));
    }

    
public void testAdd() ...{
        Example example
=new Example();
        Object o
=null
        
try...{
            Method method 
= example.getClass().getDeclaredMethod("add",new Class[] ...{int.classint.class});
            method.setAccessible(
true);                //让其方法可访问
            o = method.invoke(example, new Object[] ...{13});
        }
catch(Exception e)...{
            
        }

        assertEquals(
"4",o.toString());
    }

}

注意导入Method类的时候要为import java.lang.reflect.Method;

还要就是使用method.setAccessible(true)将这个方法设为可以访问.

运行一下我们发现已经可以进行测试了.~~

 

Java代码 复制代码  收藏代码
  1. package com.bill99.junit;   
  2.   
  3. public class ACase {   
  4.   
  5.     private String echoRequest(String request) {   
  6.         return "Hello!"+request;   
  7.     }   
  8.        
  9.     private String echoRequest() {   
  10.         return "Hello!";   
  11.     }   
  12. }  
package com.bill99.junit;

public class ACase {

	private String echoRequest(String request) {
		return "Hello!"+request;
	}
	
	private String echoRequest() {
		return "Hello!";
	}
}

 

  1. package com.bill99.junit;   
  2.   
  3.   
  4. import java.lang.reflect.Method;   
  5.   
  6. import junit.framework.Assert;   
  7.   
  8. import org.junit.Before;   
  9. import org.junit.Test;   
  10.   
  11. public class ACaseTest {   
  12.   
  13.     ACase a =null;   
  14.        
  15.     @Before  
  16.     public void setUp() throws Exception {   
  17.         a = new ACase();   
  18.     }   
  19.   
  20.     @Test  
  21.     public void testNoParamEchoRequest() throws Exception {   
  22.         //测试没有参数的echoRequest()方法   
  23.         Method testNoParamMethod = a.getClass().getDeclaredMethod("echoRequest"null);    
  24.         //Method对象继承自java.lang.reflect.AccessibleObject,父类方法setAccessible可调   
  25.         //将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。                                             
  26.         //要访问私有方法必须将accessible设置为true,否则抛java.lang.IllegalAccessException   
  27.         testNoParamMethod.setAccessible(true);    
  28.         //调用   
  29.         Object result = testNoParamMethod.invoke(a, null);   
  30.         System.out.println(result);   
  31.         Assert.assertNotNull(result);   
  32.            
  33.     }   
  34.        
  35.     @Test  
  36.     public void testParamEchoRequest() throws Exception {   
  37.         //测试带有参数的echoRequest(String request)方法   
  38.         Method testNoParamMethod = a.getClass().getDeclaredMethod("echoRequest",String.class);    
  39.         testNoParamMethod.setAccessible(true);    
  40.         //调用   
  41.         Object result = testNoParamMethod.invoke(a, "this is a test information");   
  42.         System.out.println(result);   
  43.         Assert.assertNotNull(result);   
  44.            
  45.     }   
  46.   

 

对于私有方法的单元测试,通常有以下几种方式: 1. 使用反射:通过反射机制,可以访问和调用私有方法。在单元测试中,可以使用反射来获取私有方法的引用,并进行测试。这种方法相对较为灵活,但也可能会破坏封装性。 2. 修改访问权限:将私有方法的访问权限修改为public或protected,以便在单元测试中直接调用。这种方法需要谨慎使用,因为可能会导致安全性和封装性问题。 3. 测试公共接口:私有方法通常是由公共接口调用的,因此可以通过测试公共接口来间接测试私有方法。这样可以确保私有方法在被公共接口调用时能够正常工作。 4. 使用内部类或包级私有方法:在同一个类内部或同一个包内创建一个内部类或包级私有方法,以便可以在单元测试中访问和调用私有方法。 无论选择哪种方式,都应该注意以下几点: - 单元测试应该关注方法的行为和输出,而不是具体的实现细节。私有方法通常是用来支持公共接口的,所以测试重点应该放在公共接口上。 - 单元测试应该覆盖私有方法的各种情况和边界条件,以确保私有方法的正确性和健壮性。 - 私有方法的命名通常以"_"或"__"开头,以示其为私有方法,但这只是一种约定,并不是Java语言本身的限制。 总之,选择适合的方式来测试私有方法,并确保测试覆盖率足够高,可以帮助提高代码质量和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值