1. ホーム
  2. spring

[解決済み] YAMLを使ったSpring @PropertySource

2022-07-05 01:29:42

質問

Spring Bootを使うと application.properties ファイルを YAML の同等物に置き換えることができます。しかし、私はテストでつまづいたようです。もし私が私の TestConfiguration (シンプルなJavaコンフィグ)にアノテーションを付けると、プロパティファイルを期待しているようです。

例えばこれはうまくいきません。 @PropertySource(value = "classpath:application-test.yml")

もし私がこれを YAML ファイルに記述します。

db:
  url: jdbc:oracle:thin:@pathToMyDb
  username: someUser
  password: fakePassword

で、その値を活用するとこんな感じ。

@Value("${db.username}") String username

しかし、結局このようにエラーになってしまいます。

Could not resolve placeholder 'db.username' in string value "${db.username}"

YAMLの良さをテストでも活用するにはどうしたらいいでしょうか?

どのように解決するのですか?

Spring-bootには、このためのヘルパーがあります。

@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)

をテストクラスの先頭か抽象テストのスーパークラスで指定します。

編集:私はこの答えを5年前に書きました。最近のSpring Bootのバージョンでは動作しません。これは、私が現在行っていることです(必要に応じてKotlinをJavaに翻訳してください)。

@TestPropertySource(locations=["classpath:application.yml"])
@ContextConfiguration(
        initializers=[ConfigFileApplicationContextInitializer::class]
)

が一番上に追加され、次に

    @Configuration
    open class TestConfig {

        @Bean
        open fun propertiesResolver(): PropertySourcesPlaceholderConfigurer {
            return PropertySourcesPlaceholderConfigurer()
        }
    }

をコンテキストに追加します。