@Configurationで装飾されたクラスでBean
が定義されています:
@Configuration
public class MyBeanConfig {
@Bean
public String configPath() {
return "../production/environment/path";
}
}
このBean
をオーバーライドする@TestConfigurationで装飾されたクラスがあります。
@TestConfiguration
public class MyTestConfiguration {
@Bean
@Primary
public String configPath() {
return "/test/environment/path";
}
}
configPath
Beanは、起動時に読み取る必要のある登録コードを含む外部ファイルへのパスを設定するために使用されます。 @Componentクラスで使用されます:
@Component
public class MyParsingComponent {
private String CONFIG_PATH;
@Autowired
public void setCONFIG_PATH(String configPath) {
this.CONFIG_PATH = configPath;
}
}
これをデバッグしようとしている間、各メソッドとテスト構成クラスのコンストラクター内にブレークポイントを設定します。 @TestConfiguration
のコンストラクタブレークポイントにヒットしたため、テスト構成クラスがインスタンス化することはわかっていますが、そのクラスのconfigPath()
メソッドはヒットしません。代わりに、通常の@ConfigurationクラスのconfigPath()
メソッドがヒットし、String
の@Autowired
MyParsingComponent
は、予想される../production/environment/path
ではなく常に/test/environment/path
になります。
なぜこれが起こっているのか分かりません。どんな考えでも大歓迎です。
Spring Bootリファレンスマニュアルの Detecting Test Configuration セクションに記載されているように、@TestConfiguration
アノテーションが付けられた最上位クラスで設定されたBeanはnotコンポーネントスキャンを介して取得されます。したがって、@TestConfiguration
クラスを明示的に登録する必要があります。
テストクラスで@Import(MyTestConfiguration.class)
または@ContextConfiguration(classes = MyTestConfiguration.class)
のいずれかを使用して実行できます。
一方、@TestConfiguration
アノテーションが付けられたクラスがstatic
ネストされたクラスwithinテストクラスである場合、それは自動的に登録されます。
@Beanファクトリメソッドのメソッド名が既存のBean名と一致しないことを確認してください。 config()または(私の場合)prometheusConfig()既存のBean名と衝突しました。 Springはこれらのファクトリメソッドをスキップしますサイレント単にそれらを呼び出したり、Beanをインスタンス化しません。
テストでBean定義をオーバーライドする場合は、@ Bean( "beanName")アノテーションの文字列パラメーターとしてBean名を明示的に使用します。