2013-10-21 149 views
1

我有一个Camel应用程序与spring集成,我想为它编写测试。这里是我的应用程序:我是否正确测试?

骆驼-config.xml中

<camelContext xmlns="http://camel.apache.org/schema/spring"> 
    <routeBuilder ref="converter" /> 
</camelContext> 

<bean id="converter" class="Converter"/> 

类测试:

@Component 
public class Converter extends SpringRouteBuilder { 

@Override 
public void configure() throws Exception { 

    final XmlJsonDataFormat xmlJsonFormat = new XmlJsonDataFormat(); 
    xmlJsonFormat.setTypeHints(String.valueOf("YES")); 

    from("ftp://[email protected]?" + 
      "noop=true&binary=true&consumer.delay=5s&include=.*xml") 
      .idempotentConsumer(header("CamelFileName"), FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat"))) 
      .marshal(xmlJsonFormat).to("file://data").process(
      new Processor() { 
       //System.out.println(); 
      } 
     }); 
    } 
} 

这是我的测试类:

public class RouteTest extends CamelTestSupport { 

@Override 
protected CamelContext createCamelContext() throws Exception { 
    CamelContext context = super.createCamelContext();  
    context.addComponent("ftp", context.getComponent("seda")); 
    return context; 
} 

@Override 
protected RouteBuilder createRouteBuilder() throws Exception { 
    return new RouteBuilder() { 
     @Override 
     public void configure() throws Exception {     
      from("ftp://[email protected]").to("mock:quote"); 
     } 
    }; 
} 

@Test 
public void testSameMessageArrived() throws Exception { 
    MockEndpoint quote = getMockEndpoint("mock:quote"); 
    FileReader fl = new FileReader("D:\\test\\asdasd.txt"); 
    quote.expectedBodiesReceived(fl); 
    template.sendBody("ftp://[email protected]", fl); 
    quote.assertIsSatisfied(); 
} 
} 

该测试通过,但我不确定这是测试这个特定程序的正确方法。
你能告诉我,如果我做得对,或者我应该以其他方式测试吗?

回答

1

更好的方法是不重写路线。改用你的实际路线。

@Override 
protected RouteBuilder createRouteBuilder() throws Exception { 
    return new Converter(); 
} 

然后使用camel-mock,这让你进行拦截现有的端点是这样的:

context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     // mock all endpoints 
     mockEndpoints(); 
    } 
}); 

getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World"); 

或者有图案:

context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     // mock only log endpoints 
     mockEndpoints("log*"); 
    } 
}); 

// now we can refer to log:foo as a mock and set our expectations 
getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World"); 

如果你想在测试与骆驼更多的信息,我认真的建议你阅读“骆驼在行动”一书。

编辑:这里是克劳斯易卜生对类似问题(stack)的回应。

您可以使用专用或嵌入式FTP服务器进行集成测试,也可以使用模拟进行单元测试,具体取决于您要测试的内容。你也可以做到这一点。

+0

我正在读这本书,但还没有找到类似的例子。 我还加了'@ ContextConfiguration'注解。现在我可以看到我班的测试报道。 还有一件事: 我不应该有我的ftp服务器的物理连接吗?不管我放入'expectedBodiesReceived',我的测试总是通过。这不应该是这样,对吧? – qiGuar