2012年12月24日 星期一

[Java][Android] Get private member for Unit Test

在 Unit Test 時,常常有的一個困擾是,
如何存取一個 class 的 protected / private member,
在加了好幾個 getter method 後,

參照下面連結後,

http://stackoverflow.com/questions/1771744/accessing-private-variables-in-java-via-reflection
 
最終整理出一個目前較適合自己的寫法。(兼顧彈性與安全性)
這樣每一個需要測的 class 只需要加一個 getInstanceField() 就可以了。

public class SomeActivity extends Activity {
    
    protected ListView mListView;
    
    public static Object getInstanceField(Object instance, String fieldName) {
         
         // Disable this function if it is a commericial build
         if ( true == COMMERICIAL_BUILD ) {
             return null;
         }
         
         Object obj = null;
         try {
             Field field = SomeClass.class.getDeclaredField(fieldName);
             obj = field.get(instance);
         } catch (Exception e) {
             e.printStackTrace();
         }
         return obj;
    }
}

至於在 Unit Test 那兒,就可以寫成

SomeActivity activity = getActivity();
ListView listView = (ListView) SomeActivity.getInstanceField(activity , "mListView");

還蠻方便。

P.S. 這方法似乎沒辦法捉到 superclass 的 member。需要在 superclass 加同樣的一段code