JUnit実行時に@Valueの変数へ値をセットする方法

タイトルの通りです。

ようは、JUnitでprivate変数へアクセスする方法の紹介です。

今回はその方法を2通り紹介していきます。

[スポンサーリンク]

今回やること

Springの機能に@Valueがありますが、こちらはプロパティファイルの値をprivate変数へセットするという便利な機能です。

@Value("${sample.value}")
private String value;

よくみてみると上記はprivate変数ですよね。

JUnitでこのprivate変数へアクセスしようとしたら、ちょっと特別なやりかたをする必要があります。

その方法は以下の2種類です。

もくじ

ReflectionTestUtilsでprivate変数へアクセス
@SpringBootTestでJUnit用のプロパティファイルを用意する

ReflectionTestUtilsでprivate変数へアクセス

まずは一つ目の方法です。
ReflectionTestUtils.setFieldを使って変数へ値をセットします。

7行目でprivate変数に対して値をセットしています。
値のセットは@Before の中に記述していきましょう。

public class ValueServiceTest {

    private ValueService valueService = new ValueService();
    
    @Before
    public void before() {
        ReflectionTestUtils.setField(valueService, "value", "test");
    }
    @Test
    public void test1() {
        System.out.println(valueService.get());
    }
}

@SpringBootTestでJUnit用のプロパティファイルを用意する

2つ目の方法はJUnit内で@Autowiredを使って、bean化する際に@Valueの変数へ値をセットするという方法です。

@SpringBootTestを使えば、JUnit用のプロパティファイルさえ作ってしまえば後は@Autowiredのタイミングで変数へ値をセットしてくれます。とくにこれ以上の設定は必要なしです。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ValueService2Test {

    @Autowired
    private ValueService valueService;

    @Test
    public void test1() {
        System.out.println(valueService.get());
    }
}

上記のクラスとは別にこちらのプロパティファイル(ymlですが)をsrc/test/resources/application.ymlへ置いておきましょう。

あとはJUnit実行時にprivate変数へ上記プロパティファイルの値が自動的にセットされます。

application.ymlの記述はコチラです。

sample.value: tarao

これで先程のJUnitを実行すると変数に「tarao」という文字が入っているはずです。

じっさいに動かしてご確認ください。

Javaのバージョン

今回検証したjavaのバージョンは8です。
JUnitはバージョン4です。

さいごに

@Valueを使うということは、Spring frameworkを使ってるということなので@SpringBootTestを使う方をオススメしますが、もしも色んな事情で使えない場合はリフクションUtilを使ってprivate変数へ値をセットしていきましょう!

それでは!