テストの時だけapplication.yaml
の値を変更して検証したいということがあったのでメモ。
サンプルプログラム
application.yaml
test:
isMorning: true
SampleProperties.kt
@Component
@ConfigurationProperties(prefix = "test")
class SampleProperties {
lateinit var isMorning: java.lang.Boolean
}
SampleService.kt
@Service
class SampleService(
private val properties: SampleProperties
) {
fun getGreeting(): String {
return if (properties.execution.booleanValue()) {
"Good Morning!"
} else {
"Good Afternoon!"
}
}
}
application.yaml
の値を@ConfigurationProperties
で取得して、その値に応じて分岐するというだけの簡単な処理です。
これをテストする場合@SpringBootTest(properties = ["test.isMorning=false"])
や@PropertySource
などを使用することでテストクラスごとに値を変えることはできますが、一つのテストクラス内でテストメソッドごとにプロパティの値を変更することはできません。
そこで今回はReflectionTestUtils.setField()
を使用してメンバ変数(フィールド)を直接上書きします。
テストを書いてみる
SampleServiceTests.kt
@EnableAutoConfiguration
@SpringBootTest
class SampleServiceTests {
@Autowired
lateinit var sampleService: SampleService
@Autowired
lateinit var sampleProperties: SmapleProperties
@Test
fun `isMorningがtrueの場合`() {
val result = sampleService.getGreeting()
Assertions.assertEquals("Good Morning!", result)
}
@Test
fun `isMorningがfalseの場合`() {
ReflectionTestUtils.setField(sampleProperties, "isMorning", false as java.lang.Boolean)
val result = sampleService.getGreeting()
Assertions.assertEquals("Good Afternoon!", result)
}
}
ちなみにこれ以外にもReflectionTestUtils.setField
はprivate
なメンバ変数でも値を上書きすることができます。
参考文献
SpringBootTestでapplication.propertiesの値をどうにかして使いたかった話
Mockitoでprivateメソッドのテストっぽいこと
単体テストのためのReflectionTestUtilsへのガイド