2015-10-27 59 views
4

我有一類使用@Value屬性注入字段:如何重寫在Spring中由@Value注入的字段值?

public class MyClass { 
    @Value(${property.key}) 
    private String filePath; 
    ... 

我的集成測試需要改變filePath一些不同的文件指向。

我嘗試使用反射調用方法之前設置它:

public class MyClassIT { 
    @Autowired MyClass myClass; 

    @Test 
    public void testMyClassWithTestFile1 { 
     ReflectionTestUtils.setField(myClass, "filePath", "/tests/testfile1.csv"); 
     myClass.invokeMethod1(); 
     ... 

但是,當第一個方法被調用,在@Value注射踢和變化從什麼是剛剛設置的值。任何人都可以建議如何解決這個或另一種方法?

注意:我需要Spring管理類(因此注入其他依賴項),並且使用不同測試文件的同一類需要其他測試。

回答

3

只需使用setter。無論如何,通常最好使用setter注入來代替場注入。更妙的是,完全轉換爲構造函數和setter注入,並且通常可以用mock替換Spring測試上下文。

+0

謝謝,我也簡要地考慮使用一個二傳手,唯一這讓我擔心我們已經在其他地方使用了直接字段注入,所以這將是違反約定和「改變代碼以適應測試」的輕微情況 - 但認爲它可能是最好的方式。 –

+1

@SteveChambers幸運的是,Spring可以很容易地從字段注入中逐步移植,除非在奇怪的配置類中使用它,這是最佳實踐。 – chrylis

1

嘗試spring profiling

比你能用於開發,督促,切換配置文件集成環境

@Configuration 
public class AppConfiguration { 

    @Value("${prop.name}") 
    private String prop; 


    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 


    @Configuration 
    @Profile("dev") 
    @PropertySource("classpath:dev.properties") 
    public static class DevAppConfig { 
    } 

    @Configuration 
    @Profile("test") 
    @PropertySource("classpath:test.properties") 
    public static class TestAppConfig { 
    } 
} 

比測試使用@ActiveProfile("test")

+0

謝謝。認爲這個問題是每個測試文件必須有一個配置和屬性文件 - 可能會變得非常大/特別是如果需要更改其他屬性的不同組合。 –

+1

感謝您的解釋。我理解並同意 – arthas

相關問題