- テストコードを書いていて、privateなフィールド値をどうしても参照したくて調べた
 - ちょっと強引な方法ではある
 - 本当であれば、テスト対象の方をこういった方法ではなく、テストできるようリファクタリングする方が良いかも
 
やりたいこと
- クラスのフィールド値をテスト
 - 本来返り値としては設定されていない
 
サンプルコード
public class main {
    public static void main(String[] args){
        PrintStr rs = new PrintStr();
        rs.printStr();
    }
}
今回テスト対象のクラス
privateStrの値を参照したい- メソッドそのものは
Hello World!と出力するだけ- 返り値なし
 
 
public class PrintStr {
    public String publicStr = "Hello ";
    private String privateStr = "Java!";
    public void printStr(){
        System.out.println(publicStr + privateStr);
    }
}
実行するとこんな感じ

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Field;
public class PrintStrTest {
    private PrintStr psTest;
    @BeforeEach
    private void initPrintStr(){
        psTest = new PrintStr();
    }
    @Test
    void publicStrTest(){
        Assertions.assertEquals("Hello ", psTest.publicStr);
    }
    @Test
    void privateStrTest() throws NoSuchFieldException, IllegalAccessException {
        // フィールドを取得
        Field testField = PrintStr.class.getDeclaredField("privateStr");
        // フィールドにアクセスできるようにする
        testField.setAccessible(true);
        // フィールド値を取得
        Object testStr = testField.get(psTest);
        // 値をテスト
        Assertions.assertEquals("Java!", testStr);
    }
}
Assertions.assertEquals("Java!", testStr);でprivateなフィールドのtestStrの値がJava!であることを確認
→ プライベートなフィールド(privateStr)が取得できていることを確認

  
  
  
  

コメント