0

式を持つルータを使用するSpring統合ルートがあります。この式は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> 

しかし、の属性を変更し、春にはコンテキストを読み込み、一度としてそれはそう...オーバーライド私の値は動作に影響を与えるされていないようですコンポーネントはその動作に影響を与えません。

答えて

1

式がExpressionEvaluatingRouterためCTORの引数であるので、あなたがそのようプロパティを変更することはできません。

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()と呼ばれるミューテータがあります。 1つのコンポーネントにいくつかの式が含まれている可能性があるため、primeとセッターの名前を区別することにしました。

私たちが見ているように、表現評価の実際の難しい作業は、ExpressionEvaluatingMessageProcessorにあります。ExpressionEvaluatingMessageProcessorも同様です。

お客様のメソッドごとの要件については、ApplicationContextを手動で作成し、そのsetEnvironment(new MockEnvironment()を呼び出すことのみを提案できます。そして、特別な場合には、その式に望ましい値を設定することができます。

アプリケーションコンテキストが既に開始されているときに、そのctorベースの初期化を上書きすることはできません。

+0

沖井、それはコンストラクタargですが、なぜsetPrimaryExpressionというミューテータが存在しますか? – JonathanVila

+0

TestPropertySourceについては、クラスレベルの注釈なので、真値と偽値の両方をテストするには、2つのメソッドの代わりに2つのテストクラスを作成する必要があります。したがって、メソッドレベルでDirtiesContextを配置することはできますが、メソッドレベルでプロパティをオーバーライドすることはできません。 – JonathanVila

+0

私の答えでUPDATEを見てください。 –

関連する問題