JUnitでテストする時にprivateなメンバ変数を取得・更新したい場合の方法をご紹介します。
今回はAPI「JMockit」の「Deencapsulation」クラスを使用してカプセル化された変数を参照・更新する方法です。
JMokitのダウンロード
-
以下サイトへアクセスしてダウンロードした「jmockit.jar」ファイルをクラスパスへ追加します。
クラスパスへ追加する際、JUnitより先に読み込む必要があるのでJUnitより上位へ配置します。
JMokitのダウンロード
JMokitのJavadoc
Javaソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class SampleClass1{ /** サンプルフィールド */ private String field = "hoge"; /** * <p>[概 要] サンプルメソッド</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ private String sampleMethod(String str){ return "test"; } } |
JUnitサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import static org.junit.Assert.*; import mockit.Deencapsulation; import org.junit.Test; public class SampleClass1Test { @Test public void testSampleField1() { // 準備 SampleClass1 sampleClass1 = new SampleClass1(); // 期待値 String result = "hoge"; // 実行(privateインスタンス変数の値を取得) String expected = Deencapsulation.getField(sampleClass1, "field"); // 検証 assertEquals("サンプルフィールドの値が一致していません", expected, result); } @Test public void testSampleField2() { // 準備 SampleClass1 sampleClass1 = new SampleClass1(); // 期待値 String result = "hogehoge"; // 実行(privateインスタンス変数の値を変更) Deencapsulation.setField(sampleClass1, "field", result); // 検証 String expected = Deencapsulation.getField(sampleClass1, "field"); assertEquals("サンプルフィールドの値が一致していません", expected, result); } } |