【Java】privateなフィールドをテスト

Java
  • テストコードを書いていて、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)が取得できていることを確認

参考

コメント

タイトルとURLをコピーしました