privateなフィールドを書き換えたり取得したりする方法。
単体テストで使う用。
Java SE 1.8 Eclipse4.4 JUnit4
privateフィールドへの代入
テスト対象のクラス
package privateField; public class privateField_1 { public privateField_1(){ System.out.println("コンストラクタ"); } private String _value_1="test"; //setter public void setValue_1(String value){ this._value_1=value; } //getter public String getValue_1(){ return this._value_1; } }
テストコード
package privateField; import java.lang.reflect.Field; import org.junit.Test; public class privateField_1_Test { @Test public void checkField() { privateField_1 targetClass=new privateField_1(); try{ Field reflectedField=(Field) reflectPrivateField(targetClass,"_value_1"); System.out.println("result:"+reflectedField.get(targetClass)); } catch(Exception e){ System.out.println("error:"+e); } } @Test public void checkSetMethod() { privateField_1 targetClass=new privateField_1(); targetClass.setValue_1("checkSetMethod"); try{ System.out.println("result:"+(String)getPrivateField(targetClass,"_value_1")); } catch(Exception e){ System.out.println("error:"+e); } } @Test public void checkGetMethod() { privateField_1 targetClass=new privateField_1(); try{ setPrivateField(targetClass, "_value_1", "checkGetMethod"); System.out.println("result:"+targetClass.getValue_1()); } catch(Exception e){ System.out.println("error:"+e); } } //privateなフィールドを参照する private Object reflectPrivateField(Object targetClass,String fieldName)throws Exception{ Class<?> reflectedClass =targetClass.getClass(); Field targetField=reflectedClass.getDeclaredField(fieldName); targetField.setAccessible(true); return targetField; } //privateなフィールドの値を取得する private Object getPrivateField(Object targetClass,String fieldName)throws Exception{ Class<?> reflectedClass =targetClass.getClass(); Field targetField=reflectedClass.getDeclaredField(fieldName); targetField.setAccessible(true); return targetField.get(targetClass); } //privateなフィールドに値を書き換える private void setPrivateField(Object targetClass,String fieldName,Object value)throws Exception{ Class<?> reflectedClass =targetClass.getClass(); Field targetField=reflectedClass.getDeclaredField(fieldName); targetField.setAccessible(true); targetField.set(targetClass, value); } }
実行結果
コンストラクタ result:checkSetMethod コンストラクタ result:checkGetMethod コンストラクタ result:test
備忘録として残してます。