2016-03-18 29 views
2

私はおそらく完全に何かを逃してしまったでしょうが、私が望むように私のルートをテストすることはできません。キャメルプロセッサユニット/統合テスト

私は、次のBeanを持っている:

@Component("fileProcessor") 
public class FileProcessor { 
    public boolean valid(@Header("customObject) CustomObject customObject,Exchange exchange) throws IOException{ 
     return false; 
} 

私はそうのように私のBeanを呼び出してルートをしました:ここ

from("direct:validationFile").routeId("validationFile").validate().method("fileProcessor","valid") 
     // Other stuff 
     .end(); 

は、私が見つけた例に基づいて、私のユニットテストです:

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class}) 
@ContextConfiguration(locations = { "classpath:/tu-dao-beans.xml" }) 
public class FileProcessorTest extends CamelTestSupport { 

    @EndpointInject(uri = "mock:result") 
    protected MockEndpoint resultEndpoint; 

    @Produce(uri = "direct:start") 
    protected ProducerTemplate template; 

    @Override 
    public boolean isDumpRouteCoverage() { 
     return true; 
    } 

    @Test 
    public void testSendMatchingMessage() throws Exception { 
     String expectedBody = "<matched/>"; 
     resultEndpoint.expectedBodiesReceived(expectedBody); 
     template.sendBodyAndHeader(expectedBody, "foo", "bar"); 
     resultEndpoint.assertIsSatisfied(); 
    } 

    @Test 
    public void testSendNotMatchingMessage() throws Exception { 
     resultEndpoint.expectedMessageCount(0); 
     template.sendBodyAndHeader("<notMatched/>", "foo", "notMatchedHeaderValue"); 
     resultEndpoint.assertIsSatisfied(); 
    } 

    @Override 
    protected RouteBuilder createRouteBuilder() { 
     return new RouteBuilder() { 
      public void configure() { 
//    from("direct:start").filter(header("foo").isEqualTo("bar")).to("mock:result"); 
       from("direct:start").routeId("validationFile").validate().method("fileProcessor","valid").to("mock:result"); 
      } 
     }; 
    } 
} 

fileProcessorが見つからなかったため、テストが失敗し、まだ私は私をかなり確信している私はdbunitテストのために同じbeans.xmlファイルを使用しています。私のDAOコンポーネントはうまく見つかりました...何が欠けていますか?

編集: ジェレミーBのおかげで、私は簡単に問題を解決しました。私はここでやったように、ケースに誰かがつまずく私が追加されたコードは次のとおりです。

@Autowired 
private FileProcessor fileProcessor; 

@Override 
protected JndiRegistry createRegistry() throws Exception { 
    JndiRegistry registry = super.createRegistry(); 
    registry.bind("fileProcessor", fileProcessor); 
    return registry; 
} 
+0

私はこれに関する記事を公開しました。それが役立つことを願っています:https://dev.to/matthieusb/integration-testing-on-existing-routes-with-apache-camel-and-spring-and-dbunit – matthieusb

答えて

5

あなたは「どのように」春とテストのためのofficial documentationを見ることができます。

例では、Springコンテキストを作成しますが、CamelTestSupportを使用します。このクラスは、Springコンテキストを認識しないCamelContextを作成します。 Bean "fileProcessor"はこのコンテキストでは見えません。

この種のテストを行う方法はたくさんあります。あなたの

  • @Autowire
  • 上書きcreateRegistryで、あなたのテストクラスでfileProcessorを注入し、レジストリに

をfileProcessorを追加:あなたは既に持っているコードで、多分にされ、最も簡単なCamelSpringTestSupportをオーバーライドしてcreateApplicationContextを実装できます。別の方法は、Spring Bean(xmlまたはRouteBuilderを使用)でルート定義を保持し、テストでMockEndpointまたはProducerTemplateを注入することです。