私は春のブートプロジェクトを持っていますが、それは素晴らしい作品です。アプリケーションのテストを作成したいのですが、構成の頭痛の種がいくつかあります。
Spring bootはApplicationTestsというテストクラスを作成しました。それは本当にシンプルで、このように見えます:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DuurzaamApplicationTests {
@Test
public void contextLoads() {
}
}
テストを開始すると、このエラーが発生します。
Java.lang.IllegalArgumentException: Could not resolve placeholder 'company.upload' in value "${company.upload}"
Src/test/resourcesディレクトリにproperties.ymlファイルがあり、何らかの理由でロードされません。インターネット上の例からさまざまな種類の注釈を試しましたが、どれも機能しません。
Application.ymlファイルを使用してプロパティをロードするようにスプリングブートテストに指示するにはどうすればよいですか?
@TestPropertySource
または@PropertySource
を使用してプロパティファイルをロードできます
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:properties.yml")
@ActiveProfiles("test")
public class DuurzaamApplicationTests {
@Test
public void contextLoads() {
}
}
驚いたことに、Spring Boot Testでプロパティファイルを読み込むと、.yml
はサポートされません。暗黙的ではありますが、ドキュメントに記載されています。
上記のリンクから:
サポートされているファイル形式
「classpath:/com/example/test.properties」または「file:/path/to/file.xml」など、従来のプロパティファイル形式とXMLベースのプロパティファイル形式の両方がサポートされています。
.yml
は言及されていません。
そして、.yml
を.properties
に変更し、xx.xx.xx=value
形式で値を書き換えると、キーと値のペアを正しく読み取ることができます。
とても奇妙。
編集:
今、私はこの問題に対処するチケットを見つけました。 Springで古くから知られているバグのようです。
https://github.com/spring-projects/spring-framework/issues/18486
@PropertySource
および@TestPropertySource
YAMLでは動作しません。 this を参照してください。
私も自分でテストしました。 2つのファイル-* .ymlと* .propertiesを作成してみて、自分で確認してください。
作る *.yml
ほとんどの人が使用する仕事@SpringBootTest
、しかし、それがあなたが望むものではなく、あなたが@ContextConfiguration
代わりに、あなたはちょっと驚きました。
私にとっては、上記のソリューションは機能せず、環境変数は@TestPropertySourceで定義されたテストプロパティをオーバーライドしていました https://docs.spring.io/spring-boot/docs/current/reference/html/ boot-features-external-config.html は、このソースが環境変数よりも優先順位が高いことを示します。私のために働いた唯一の解決策は、テスト構成クラスでPropertyPlaceholderConfigurer
Beanを手動で定義し、それを最高の優先度で設定することでした。
これはSpring Boot 1.5.15.RELEASEでした
@Configuration
@TestPropertySource(properties = "/application-test.properties")
@Slf4j
public class IntegrationTestConfiguration {
@Bean
public static PropertyPlaceholderConfigurer properties() {
PropertyPlaceholderConfigurer ppc
= new PropertyPlaceholderConfigurer();
Resource[] resources = new ClassPathResource[]
{ new ClassPathResource( "/application-test.properties" ) };
ppc.setLocations( resources );
ppc.setIgnoreUnresolvablePlaceholders( true );
ppc.setOrder( Ordered.HIGHEST_PRECEDENCE );
return ppc;
}
/// ....
@RunWith( SpringRunner.class )
@ActiveProfiles( "test" )
@Import( IntegrationTestConfiguration.class )
@SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
public class MyTest {