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の間には多くの矛盾する情報があり、確実に機能するものは見つかりません。
どんな洞察もありがたいことに感謝します。乾杯!
(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 {
}
}
@TestPropertySource
のlocations
プロパティを使用して、プロパティをオーバーライド(または追加)しました。
これは私のために働いた(春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以降で修正する必要があります。 問題をクローズするコミット を参照してください。今では、提示された方法で宣言されたプロパティが優先されるはずです。
@Valueを使用するには、${...}
プレースホルダーを解決するためにPropertySourcesPlaceholderConfigurer Beanが必要です。ここで受け入れられている答えを参照してください: @ ValueがJava構成のテストコンテキストを介して設定されていない
For Me @TestPropertySource( "classpath:xxxxxxxx.properties")が機能しました
@PropertySource("classpath:document.properties")
または@PropertySource("classpath*:document.properties")
を使用してみましたか?
@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で見つからない場合、これは私のために働いた。あなたにとってもうまくいく