記得以前剛接觸junit那會,對於公有方法的測試運用的很是流暢,並且私人方法也是在這些公有方法中調用,都會測試覆蓋到。
由於是建立的類,建立的方法,造資料一步一步的覆蓋跑下去,確實只要有耐心,都可以搞定。
但是隨著項目的逐漸深入,由於人員成本,時間成本等等問題,測試類別的維護不知道從哪一個版本,
哪一位開發人員修改了商務邏輯開始,已經問題百出,一線飄紅了,但是項目一直跑著也沒出現什麼問題[運氣不錯],
而且時間成本等問題一直存在,但是在這時你只是修改了私人方法的一部分邏輯,但是測試類別你這次又必須得維護,
所以有兩點必須解決:
1.把原有的測試case按照現有的邏輯把【主體】調通。
2.測試自己修改過的私人方法商務邏輯。
關於第一點沒啥捷徑,根據主邏輯調通。
關於第二點可以修改私人方法的修飾符,但是這種方式需要改動代碼,所以不太靠譜,建議不要使用。
此處介紹通過反射來測試私人方法,方便實用。也能深刻體驗一下反射的好處。
// 待測試的私人方法類
public class MethodClass
{
private int add(int a, int b)
{
return a + b;
}
}
// junit測試類別
public class MethodClassTest extends TestCase
{
public void testAdd()
{
MethodClass mc = new MethodClass();
// 得到class對象
Class<MethodClass> clazz = MethodClass.class;
// 得到方法
try
{
Method method = clazz.getDeclaredMethod("add", new Class[] {int.class, int.class });// 這裡也可以用:Integer.TYPE
method.setAccessible(true);// 抑制存取修飾詞,使得私人方法變為可以訪問的
Object result = method.invoke(mc, new Object[] { 2, 3 });
Assert.assertEquals(5, result);
}
catch (Exception e)
{
e.printStackTrace();
Assert.fail();
}
}
}