Androidのテストをする上で、テスト対象となるクラスのフィールドやメソッドにアクセスしたい時があったので、その方法について記す。
フィールド
フィールドにアクセスするときは以下のようにFieldクラスを使う。
テスト対象クラスがPersonActivity、テストクラスがPersonActivityTestとしている。
PersonActivity.java
public class PersonActivity{
private weight = 150;
private cry(int index){}
}
PersonActivityTest.java
public class PersonActivityTest{
//1. インスタンス生成(4の段階で使う)
PersonActivity personActivity = activityTestRule.launchActivity(null);
//2. Field型の変数を定義し、getDeclaredField()の引数にアクセスしたいフィールド名を指定する
Field fieldWeight = PersonActivity.class.getDeclaredField("weight");
//3. アクセスしたいフィールドがprivateの時は、これをtrueにすることでアクセス可能になる
fieldWeight.setAccessible(true);
//4. アクセスしたいフィールドの値をテスト用に変更したいとき行う。
//体重を150から49に変える
fieldWeight.set(personActivity, 49);
//5. Field型変数から値を取り出す、これをキャストするなりしてassertをつかってテストする
fieldWeight.get(personActivity);
}
メソッド
メソッドにアクセスする場合はMethodクラスを使う。
PersonActivityTest.java
public class PersonActivityTest{
//1. インスタンス生成
PersonActivity personActivity = activityTestRule.launchActivity(null);
//2. Method型の変数を定義し、getDeclaredMethod()の引数にアクセスしたいメソッド名とメソッドの引数の型を指定する
Method methodCry = PersonActivity.class.getDeclaredMethod("cry", int.class);
//3. アクセスしたいメソッドがprivateの時は、これをtrueにすることでアクセス可能になる
methodCry.setAccessible(true);
//4. Method型変数からinvoke()を使ってメソッドを実行する、これをキャストするなりしてassertをつかってテストする
//第一引数にメソッドを持つクラスのインスタンス、第二引数にそのメソッドの引数を渡す減る
methodCry.invoke(personActivity, 2);
}