2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Spring】Unitテストで一部のテストでのみapplication.yamlの値を上書きする方法【Kotlin】

Posted at

テストの時だけ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 `isMorningtrueの場合`() {
        val result = sampleService.getGreeting()
        Assertions.assertEquals("Good Morning!", result)
    }

    @Test
    fun `isMorningfalseの場合`() {
        ReflectionTestUtils.setField(sampleProperties, "isMorning", false as java.lang.Boolean)

        val result = sampleService.getGreeting()
        Assertions.assertEquals("Good Afternoon!", result)
    }
}

ちなみにこれ以外にもReflectionTestUtils.setFieldprivateなメンバ変数でも値を上書きすることができます。

参考文献

SpringBootTestでapplication.propertiesの値をどうにかして使いたかった話
Mockitoでprivateメソッドのテストっぽいこと
単体テストのためのReflectionTestUtilsへのガイド

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?