ここ数年で何回かぶち当たってたことが解決したので備忘録として。内容はタイトルの通りです。
@SpringBootTest
を使ってテスト書けば設定ファイルを読み込んでくれるので悩む必要はないんですけど、大人の事情でそういうことができない場合もありますよね。そうすると当然、設定ファイルを読み込んでくれないわけです。
今回、@SpringBootTest
を使ってテストを書かなくても設定ファイルを読み込めるようなテストを書きました。
app.properties
app.domain=b1a9idps.com
AppProperties.java
@ConfigurationProperties("app") public class AppProperties { private String domain; // getterとsetterは省略 }
TestConfig.java
@TestConfiguration // @EnableConfigurationProperties は、@ConfigurationProperties が付与されたクラスに設定ファイルの値をセットする @EnableConfigurationProperties(value = AppProperties.class) public class TestConfig {}
ConfigurationPropertyTest.java
@ExtendWith(SpringExtension.class) @TestPropertySource(properties = "spring.config.name=app") // TestConfigクラスを適用して、設定ファイルを読み込む。 https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/spring-boot-features.html#boot-features-configfileapplicationcontextinitializer-test-utility @ContextConfiguration(classes = {TestConfig.class}, initializers = ConfigFileApplicationContextInitializer.class) class ConfigurationPropertyTest { @Autowired private AppProperties appProperties; @Test void getValue() { assertEquals("b1a9idps.com", appProperties.getDomain()); } }
おまけ(メソッドに @ConfigurationProperties
を付与している場合)
app.properties
app.app.name=uchitate
AppAppProperties.java
public class AppAppProperties { private String name; // getterとsetterは省略 }
AppAppConfig.java
@Configuration public class AppAppConfig { @Bean @ConfigurationProperties("app.app") public AppAppProperties appAppProperties() { return new AppAppProperties(); } }
TestConfig.java
@TestConfiguration // ConfigクラスをBean登録する @Import(AppAppConfig.class) @EnableConfigurationProperties public class TestConfig {}
ConfigurationPropertiesTest.java
@ExtendWith(SpringExtension.class) @TestPropertySource(properties = "spring.config.name=app") @ContextConfiguration(classes = {TestConfig.class}, initializers = ConfigFileApplicationContextInitializer.class) class ConfigurationPropertyTest { @Autowired private AppAppProperties appAppProperties; @Test void getValue() { assertEquals("uchitate", appAppProperties.getName()); } }
テストクラスは、AppProperties.javaのテストとほぼ同じです
今回の環境
Java11 Spring Boot 2.2.RELEASE