web-dev-qa-db-ja.com

@TestPropertySourceは、Spring 1.2.6のAnnotationConfigContextLoaderを使用したJUnitテストでは機能しません。

Spring 4.1.17でSpring Boot 1.2.6.RELEASEを使用して何も動作しないようです。私はアプリケーションのプロパティにアクセスし、必要に応じてテストでオーバーライドしたいだけです(ハックを使用してPropertySourceを手動で挿入することなく)

これは機能しません。

@TestPropertySource(properties = {"elastic.index=test_index"})

これも..

@TestPropertySource(locations = "/classpath:document.properties")

これも..

@PropertySource("classpath:/document.properties")

完全なテストケース..

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
@TestPropertySource(properties = {"elastic.index=test_index"})
public class PropertyTests {
    @Value("${elastic.index}")
    String index;

    @Configuration
    @TestPropertySource(properties = {"elastic.index=test_index"})
    static class ContextConfiguration {
    }

    @Test
    public void wtf() {
        assertEquals("test_index", index);
    }
}

その結果

org.junit.ComparisonFailure: 
Expected :test_index
Actual   :${elastic.index}

3.xと4.xの間には多くの矛盾する情報があり、確実に機能するものは見つかりません。

どんな洞察もありがたいことに感謝します。乾杯!

25
Thomas Beauvais

(Springがこの見落としを修正するまで)最良の方法は、test.properties(またはあなたが望むもの)と@Importを導入するPropertySourcesPlaceholderConfigurer、または@Configurationを拡張することです。

import org.Apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import Java.io.IOException;

@Configuration
public class PropertyTestConfiguration {
    @Bean
    public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() throws IOException {
        final PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ppc.setLocations(ArrayUtils.addAll(
                        new PathMatchingResourcePatternResolver().getResources("classpath*:application.properties"),
                        new PathMatchingResourcePatternResolver().getResources("classpath*:test.properties")
                )
        );

        return ppc;
    }

}

これにより、application.propertiesでデフォルトを定義し、test.propertiesでそれらをオーバーライドできます。もちろん、複数のスキームがある場合は、必要に応じてPropertyTestConfigurationクラスを構成できます。

そして、これを単体テストで使用します。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class PropertyTests {
    @Value("${elastic.index}")
    String index;

    @Configuration
    @Import({PropertyTestConfiguration.class})
    static class ContextConfiguration {
    }
}
14
Thomas Beauvais

@TestPropertySourcelocationsプロパティを使用して、プロパティをオーバーライド(または追加)しました。

これは私のために働いた(春4.2.4):

@TestPropertySource(locations = {
   "classpath:test.properties",
   "classpath:test-override.properties" })

しかし、以下のようなプロパティをオーバーライドすることはしませんでした:

@TestPropertySource(
  locations = {"classpath:test.properties"},
  properties = { "key=value" })

Javadocでは、これらのプロパティの優先順位が最も高いとされていますが。多分バグ?

更新

このバグは、Springブートバージョン1.4.0以降で修正する必要があります。 問題をクローズするコミット を参照してください。今では、提示された方法で宣言されたプロパティが優先されるはずです。

14

@Valueを使用するには、${...}プレースホルダーを解決するためにPropertySourcesPlaceholderConfigurer Beanが必要です。ここで受け入れられている答えを参照してください: @ ValueがJava構成のテストコンテキストを介して設定されていない

6
Don Bottstein

For Me @TestPropertySource( "classpath:xxxxxxxx.properties")が機能しました

4
Swarit Agarwal

@PropertySource("classpath:document.properties")または@PropertySource("classpath*:document.properties")を使用してみましたか?

3
user2004685

@TestPropertySourceに問題がありました。 test.propertiesが見つかりません

以下は修正前のものです

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ExtContext.class)
@TestPropertySource(locations = "classpath: test.properties")

以下のように、classpath:とtest.propertiesの間のスペースを削除しました

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ExtContext.class)
@TestPropertySource(locations = "classpath:test.properties")

Test.propertiesがclasspthで見つからない場合、これは私のために働いた。あなたにとってもうまくいく

1
S.Sriniavasulu