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