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'のエンドポイションの模擬テストを行うには、どうすればよいですか?
問題は、私の質問の例は、原則をテストするためのプレーの例に過ぎないということです。私の実際のルートバネxmlファイルには、たくさんのルートとびっくりされる必要のあるたくさんの豆が含まれています。私がルートをテストする必要があるたびにこれを行うことは、極端なように見えます。そして、私がテストしたくないことに応じて、おそらく異なるモッククラスが必要になるでしょう。 – numfar
ロジックを少しリファクタリングするとどうなりますか?重要な部分は、メソッドが呼び出されたことをテストするのではなく、ルート全体が期待どおりに動作していることです。例えば、ルートの最後にExchangeをチェックするか、別のルートが呼び出された(そして 'direct:'または 'seda:'コンポーネントをモックする)ことを確認します。 メソッドのみをチェックする必要がある場合、Beanの単体テストだけでCamelは必要ありません。 –