2017-04-16 69 views
0

我與如何重寫一個.yml文件ReflectionTestUtils.setfield未覆蓋本地項目屬性屬性

我們使用Spring框架和使用說明(如@InjectMocks)內的屬性文件中掙扎。

我在配置項目YML文件中聲明瞭一個名爲「one-platform-properties」的屬性,名爲paysafe-ss-fx-service.yml。它設置了一個名爲maxRecoveryAge=0的變量。它實際上是一個生活緩衝區的時間。

oneplatform: 
    environment: local 
publisher: 
    rates: 
    maxRecoveryAge: 0 
    interPublishDelay: 500 

問題是我希望能夠在運行時在我的測試中進行調整。將緩衝區設置爲1小時5小時24小時。

我在測試中使用ReflectionTestUtils.setfield(PublisherClass, "maxDocumentAge", 1, int.class)調用來調整時間,但該值沒有被覆蓋。當我對我的測試工具中的變量執行監視時,但是一旦測試運行滲透到微服務代碼中,覆蓋的值就會丟失。如何在所有測試中保留重寫值的任何想法?

我的目標是在我的測試運行使用不同的變化:

ReflectionTestUtils.setField(new FxRatesEventPublisher(),"maxRecoveryAge",1,int.class); 
ReflectionTestUtils.setField(new FxRatesEventPublisher(),"maxRecoveryAge",5,int.class); 
ReflectionTestUtils.setField(new FxRatesEventPublisher(),"maxRecoveryAge",24,int.class); 

,基本上覆蓋在項目定義的屬性文件中定義的值。

回答

0
ReflectionTestUtils.setField(producerConfiguration, "messageProducer", realProducer); 
Object target = AopTestUtils.getUltimateTargetObject(fxRatesEventPublisher); 
int recoveryAge = -1; 
ReflectionTestUtils.setField(target, "maxRecoveryAge", recoveryAge); 
0

爲什麼不使用@TestPropertySource#properties

以下示例演示瞭如何聲明內聯屬性。

@ContextConfiguration 
@TestPropertySource(properties = { "timezone = GMT", "port: 4242" }) 
public class MyIntegrationTests { 
    // class body... 
} 

注意,從javadocs

@TestPropertySource是一個類級別的註釋

這意味着你需要有不同的類,針對不同的配置值你想用。

+0

我最初嘗試過,但數值仍然沒有被覆蓋。請參閱下面的最終答案。 –

0

我假設你沒有遵循最新的春季公約和最佳實踐告訴我們prefer constructor based injection over field based injection

如果你宣佈你這樣的豆:

public class FxRatesEventPublisher { 
    private final Integer maxRecoveryAge; 
    private final SomeDependency someDependency; 

    public FxRatesEventPublisher(@Value("${publisher.rate.maxRecoveryAge}") Integer maxRecoveryAge, @Autowired SomeDependency someDependency) { 
     this.maxRecoveryAge = maxRecoveryAge; 
     this.someDependency = someDependency; 
    } 
} 

那麼那麼你可以這樣說:

// Create an instance with your test values injected. Note that you could inject mocked dependency here as well as the real one. 
FxRatesEventPublisher fxRatesEventPublisher = new FxRatesEventPublisher(24, mockDependency); 

在這種情況下,它更容易來測試你的組件,你可以將任何值傳遞給構造函數。我同意這似乎不如基於財產的注射那麼漂亮,但至少值得一看。