2017-11-03 11 views
0

Apache Camel 2.15.3を使用してアプリケーションをビルドしました。そして私はdependency injectionのためにspring-xmlを使ってルートを配線しています。私は自分のルートの自動テストを書く方法を理解するのに苦労しています。たとえば、私はルートを持っているかもしれません:Apacheのラクダルートのテスト

<onException id="Exception"> 
     <exception>java.lang.Exception</exception> 
     <handled> 
      <constant>true</constant> 
     </handled> 
     <to uri="direct:fear"/> 
    </onException> 

    <route id="happyStory"> 
     <from uri="direct:inTheBeginning"/> 
     <to uri="bean:enchantedKingdom?method=warn" /> 
     <to uri="bean:fluffykins" /> 
    </route> 

    <route id="scaryStory"> 
     <from uri="direct:fear"/> 
     <onException> 
      <exception>java.lang.Exception</exception> 
      <handled> 
       <constant>true</constant> 
      </handled> 
     </onException> 
     <to uri="bean:monster"/> 
     <choice> 
      <when> 
       <simple>${header.succesfullywarned}</simple> 
       <to uri="bean:enchantedKingdom?method=hide"/> 
      </when> 
      <otherwise> 
       <to uri="bean:enchantedKingdom?method=panic" /> 
      </otherwise> 
     </choice> 
    </route> 

を私は時に豆その後、Beanメソッドが警告したときに、ヘッダがメッセージに設定されるべきである「succesfullywarned」と呼ばれていると言うことができるようにwan'tとfluffykinsが呼び出されると、メッセージが "scaryStory"に送られる例外が発生するはずです。この場合、Beanメソッドhideが呼び出されることをアサートすることはできません。

これは大体私のテストクラスのセットアップです:

@RunWith(CamelSpringJUnit4ClassRunner.class) 
@ContextConfiguration({"/META-INF/spring/route- 
stories.xml","/META-INF/spring/beans.xml"}) 
@MockEndpointsAndSkip("(bean:fluffykins|bean:monster|bean:enchantedKingdom?method=warn|bean:enchantedKingdom?method=hide|bean:enchantedKingdom?method=panic)") 
public class StoryHappyRouteTest extends CamelSpringTestSupport { 

private String url = "direct:inTheBeginning"; 

@Autowired 
private ApplicationContext applicationContext; 

@Override 
protected AbstractApplicationContext createApplicationContext() { 
    return (AbstractApplicationContext)applicationContext; 
} 

@Test 
public void test(){ 

    MockEndpoint warn = getMockEndpoint("mock:bean:enchantedKingdom?method=warn"); 
    MockEndpoint fluffy = getMockEndpoint("mock:bean:fluffykins"); 
    MockEndpoint monster = getMockEndpoint("mock:bean:monster"); 
    MockEndpoint hide = getMockEndpoint("mock:bean:enchantedKingdom?method=hide"); 
    MockEndpoint panic = getMockEndpoint("mock:bean:enchantedKingdom?method=panic"); 

    fluffy.whenAnyExchangeReceived(new Processor() { 
     @Override 
     public void process(Exchange exchange) throws Exception { 
      System.out.println("Bunny!"); 
      throw new NullPointerException(); 
     } 
    }); 

    template.sendBody(url,""); 

    warn.assertExchangeReceived(0); 
    fluffy.assertExchangeReceived(0); 
    monster.assertExchangeReceived(0); 
    panic.assertExchangeReceived(0); 

} 

}

私はアクションでラクダの初版でのテストの章を読んで、マニュアル(http://camel.apache.org/testing.html)で周りを見てきましたが、私は自分の状況でそれを適用する方法を理解していない。上記のテストでは、複数のメソッドを持つBeanがある場所以外はすべて動作しますので、 "?method = methodname"というURIがあり、何らかの理由でこれが動作しなくなります。エラーは出ませんが、モックは使用されず、代わりに実際のBeanが呼び出されます。 私がやりたいことをすることはできませんか?どのような方法でもテスト設定を変更できますが、ルートとBeanがspring-xmlファイルで定義されていることが前提です。

私は、エンドポイントではなく、自分自身を嘲笑することについて教えてきましたが、私が考えることができる唯一の方法は、すべてのBeanが定義されている「imposter-beans.xml」ファイルを作成することです。ルートで使用されるすべてのクラスを拡張します。しかし、それは精巧で間違ったアプローチのように感じます。

答えて

1

モックがメッセージを受け取ったときに何をすべきかコードを書くことができます。これは、第6.2.6節の書籍の中で、whenAnyExchangeReceivedwhenExchangeReceivedのようなメソッドを使うことができます。これらのインラインプロセッサでは、ヘッダを設定したり、例外を投げることができます。例えば、リスト6.9を参照してください。

+0

はい、これは私が望んでいないと思います。私がそれを試してみると、私はそれを働かせることができませんでした。今私はもう一度やり直してもう少しだが、エンドポイントとして複数のメソッドを持つBeanで動作させることはできない。この設定を表示するために投稿を編集しました。それは不可能か何かを逃していますか? – numfar

関連する問題