2017-11-06 12 views
0

Apache Camel 2.15.3を使用してアプリケーションをビルドしました。そして私はdependency injectionのためにspring-xmlを使ってルートを配線しています。私は、Beanであるエンドポイントを模擬し、uriにメソッド・オプションを持つテストを作成しようとしています。uriでmethodオプションを使用してBeanエンドポイントを模擬する

<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と:

マイルート

は、このようになりますBean fluffykinsが呼び出されると、メッセージが "scaryStory"に送られる例外が発生するはずです。この場合、Beanメソッド 'panic'が呼び出されると主張することはできません。

これはテストです:

@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); 

    } 
} 

それがルートで使用される複数のメソッドが含まれenchantedKingdom豆、豆以外のすべてのために正常に動作します。この場合モックは使用されませんが、実際のBeanメソッドが呼び出されますが、これは私が望んでいないものではありません。そして、テストでは失敗したのは、ルートで呼び出されるモックではないからです。

uri 'bean:enchantedKingdom?method = warn'、 'bean:enchantedKingdom?method = hide'、および 'bean:enchantedKingdom?method = panic'のエンドポイションの模擬テストを行うには、どうすればよいですか?

答えて

0

私はテストアプローチを変更し、Beanへの呼び出しを模倣しようとはしません。 代わりに、模擬されたbeanインスタンスを作成し、それをテストで使用します。

そして、テスト目的

@ContextConfiguration(
    {"/META-INF/spring/route-stories.xml", 
    "/META-INF/spring/beans-test1.xml"}) 

そして、あなたのテストコードでBeanとアサートを取得するために使用さ春ファイルでこのBeanを宣言嘲笑豆(コードによって、またはライブラリをからかっ)

public class MockEnchantedKingdom { 

    public boolean panicCalled = false; 

    public void panic() { 
     // do things 
     panicCalled = true; 
    } 
} 

を定義します必要なもの

// context is CamelContext you should have access to it 
MockEnchantedKingdom enchantedKingdom = (MockEnchantedKingdom) context.getRegistry().lookupByName("enchantedKingdom"); 
Assert.asserttrue(enchantedKingdom.panicCalled); 

異なるテスト用に異なるbeans-test*.xmlを作成してくださいMockitoや他のライブラリを使ってモックを作成することもできます。

ルートコードは常に同じで、各テストでBeanの動作を制御できます。

+0

問題は、私の質問の例は、原則をテストするためのプレーの例に過ぎないということです。私の実際のルートバネxmlファイルには、たくさんのルートとびっくりされる必要のあるたくさんの豆が含まれています。私がルートをテストする必要があるたびにこれを行うことは、極端なように見えます。そして、私がテストしたくないことに応じて、おそらく異なるモッククラスが必要になるでしょう。 – numfar

+0

ロジックを少しリファクタリングするとどうなりますか?重要な部分は、メソッドが呼び出されたことをテストするのではなく、ルート全体が期待どおりに動作していることです。例えば、ルートの最後にExchangeをチェックするか、別のルートが呼び出された(そして 'direct:'または 'seda:'コンポーネントをモックする)ことを確認します。 メソッドのみをチェックする必要がある場合、Beanの単体テストだけでCamelは必要ありません。 –

関連する問題