web-dev-qa-db-ja.com

スプリングブートテスト-テストプロパティが見つかりません

私は春のブートプロジェクトを持っていますが、それは素晴らしい作品です。アプリケーションのテストを作成したいのですが、構成の頭痛の種がいくつかあります。

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ファイルを使用してプロパティをロードするようにスプリングブートテストに指示するにはどうすればよいですか?

14

@TestPropertySourceまたは@PropertySourceを使用してプロパティファイルをロードできます

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:properties.yml")
@ActiveProfiles("test")
public class DuurzaamApplicationTests {
    @Test
    public void contextLoads() {
    }    
}

ドキュメント: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/TestPropertySource.html

11
Barath

驚いたことに、Spring Boot Testでプロパティファイルを読み込むと、.ymlはサポートされません。暗黙的ではありますが、ドキュメントに記載されています。

上記のリンクから:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/TestPropertySource.html

サポートされているファイル形式

「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

5
WesternGun

@PropertySourceおよび@TestPropertySource YAMLでは動作しません。 this を参照してください。

私も自分でテストしました。 2つのファイル-* .ymlと* .propertiesを作成してみて、自分で確認してください。

作る *.ymlほとんどの人が使用する仕事@SpringBootTest、しかし、それがあなたが望むものではなく、あなたが@ContextConfiguration代わりに、あなたはちょっと驚きました。

1
yuranos87

私にとっては、上記のソリューションは機能せず、環境変数は@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 {
0
GameSalutes