2017-02-28 64 views
0

我們有一個使用路由器和表達式的彈簧集成路由。該表達式在yml文件中設置。 我想創建單元測試手動設置此路由器屬性的值,但它似乎不工作。以編程方式設置彈簧集成路由器屬性

測試

@Autowired 
EventDrivenConsumer myrouter; 
..... 
((ExpressionEvaluatingRouter) myrouter.getHandler()).setPrimaryExpression(new SpelExpressionParser().doParseExpression("true")); 

的XML上下文的一部分

<int:router input-channel="catchweightExcluderChannel" expression="${rip.config.exclude_catchweight}" default-output-channel="productTransformerChannel"> 
    <int:mapping value="true" channel="catchWeightFilteringChannel" /> 
    <int:mapping value="false" channel="productTransformerChannel" /> 
</int:router> 

但似乎我的overrided不影響行爲價值......它似乎一旦Spring讀取的背景下,改變屬性組件不會影響其行爲。

回答

1

你不能改變,那是因爲表達了ExpressionEvaluatingRouter一個構造函數ARG屬性:

public class ExpressionEvaluatingRouter extends AbstractMessageProcessingRouter { 

    public ExpressionEvaluatingRouter(Expression expression) { 
     super(new ExpressionEvaluatingMessageProcessor<Object>(expression)); 
     setPrimaryExpression(expression); 
    } 

} 

我想爲您的測試用例的@TestPropertySource將是最好的解決辦法:

@RunWith(SpringRunner.class) 
@TestPropertySource(properties = "rip.config.exclude_catchweight:true") 

UPDATE

但再按W HY是有一個叫setPrimaryExpression

setPrimaryExpression()及其可視化工具和日誌,使基於表達式的成分多的分析清潔兄弟getExpression()突變。由於一個組件可能有多個表達式,因此我們決定區分一個prime,因此這個名稱代表setter。

表達評估的真正努力在ExpressionEvaluatingMessageProcessor那裏完成,這也是基於ctor的,正如我們所看到的。

對於您的每種方法要求,我只能建議手動創建ApplicationContext並將其稱爲setEnvironment(new MockEnvironment()。並且在那裏,您可以在特定情況下爲該表達式填充期望的值。

當您的應用程序上下文已經啓動時,您無法覆蓋基於ctor的初始化。

+0

Oki,它是一個構造函數arg,但是爲什麼還有一個叫做setPrimaryExpression的增變器? – JonathanVila

+0

關於TestPropertySource是一個類級別的註釋,所以爲了測試true和false值,我需要創建2個測試類而不是2個方法。所以,儘管我可以在方法級別放置DirtiesContext,但我無法在方法級別設置任何重寫屬性的東西? – JonathanVila

+0

在我的答案中查看更新。 –

相關問題