Valueを付与した変数にJUnitでモックする方法
概要
-
@Value
を付与した変数を扱うクラスのテストを実施した際、@Value
の変数の値がテスト時のみnullとなってしまう事象が発生 -
以下テスト対象のクラス
@Component
public class HogeService {
@Value("${sample.variable}")
private String sampleVariable; ← ここの変数がテストでnullで返ってくる
...
↑の件、少し解決につまづいたので、解決方法を記載
結論
-
org.springframework.test.util.ReflectionTestUtils
を利用することでmockできる
ReflectionTestUtils.setField(instance, "name", "value", String.class);
サンプル
-
@Value
を利用しているクラス
@Component
public class HogeService {
@Value("${sample.variable}")
private String sampleVariable;
...
-
@Value
を利用しているクラスのテストコード
@ExtendWith(MockitoExtension.class)
public class HogeServiceTest {
@InjectMocks
private HogeService hogeService;
@BeforeEach
private void setup() {
ReflectionTestUtils.setField(
hogeService,
"sampleVariable",
"test",
String.class);
}
...
理由
-
@Value
は外部から値をインジェクションしているため、JUnitでテストを実施する際もmockの設定をしなければ、外部のファイルから自動で読み取ってくれないので、@Valueを付与した変数は値がnullになってしまう - そのため、テストでは
@Value
を付与した変数にReflectionTestUtils.setField
を利用し、値をインジェクションすることで解決
補足
@Valueとは
-
@Value
は別のファイルから値をインジェクションしたいときに用いるアノテーション - application.ymlやapplication.propertiesに記載されている値を読み取ると気に利用する
例
- 読み取り先のファイル
application.yml
sample:
hoge: test
- 指定方法
@Value("{sample.hoge}")
private String sampleHoge;
...