2016年5月19日 星期四

使用 JUnit 測試 private method

關於在 Unit Test 時,private method 到底是否應該測試的問題
應該是一個社群持續爭論中的問題~
相關的說法有部份可以參考看看 [1],這裡先跳過這個問題不管。
假設目標是要測試 private method,實務上可以利用 Reflection API 來達成 [2-3]。
具體來說,就是像以前我 PO 過的動態載入類別的文章 [3] 那樣
透過動態載入的方式取得 method 的實體,並且額外呼叫 setAccessible() 來忽略檢查
就可以達到在 JUnit Test 裡呼叫 private method 的目的了。

假設有一個 Target 類別,包含一個名稱為 privateMethod() 的 static 方法 privateMethod() 的參數是 String 和 long,回傳值是 boolean,則範例如下:
Method method = Target.class.getDeclaredMethod("privateMethod", String.class, long.class);
method.setAccessible(true);
boolean result = (boolean) method.invoke(Target.class, "", 1);
// Test the result.
Assert.assertTrue(result);

參考資料:
  1. Testing Private Methods with JUnit and SuiteRunner
  2. How to test a class that has private methods, fields or inner classes?
  3. 動態載入 Class 並呼叫 Class 的 Method

沒有留言: