Define routes:

Either using Spring xml or Java DSL.

Spring xml:

<camelContext>

  <routeBuilder ref="myBuilder" />   //to load the Java DSL routes defined in MyRouteBuilder class

  <routeContextRef> //to load the routes in <routeContext> defined in other xml file

    <route> 

    <from> <process> <to>

  </route>

</....>

<bean id="myBuilder" class="org.apache.camel.spring.example.test1.MyRouteBuilder"/>

Java DSL:

extends RouteBuilder, implement the abstract method configure().

@Override
public void configure() throws Exception {

  Endpoint orderUpdates = endpoint("pubsub://batman-order-updates");
  from("pubsub://adv-updates").process(galaxyAdvCache.input(header(Ref.INBOX)));

}

Apache Camel Test

In the separate integration module:

main/java: BGIntegration.java[RouteBuilder]

main/resources: integration-b-g.xml(Only used to include the java DSL route in BGIntegration into Camel context).

test/java: BMock.java[RouteBuilder], GMock.java[RouteBuilder], BGIntegrationTest.java

test/resources: mock-b-g.xml

Only the BGIntegration.java is used for the tests in test project, all the other 3 are for unit test.

In BGIntegration:

matcher.request("b://pubsub://b-order-updates").uniqueCorrelationId(orderId())
    .reply("g:pubsub://tibrv-incoming-suggestion").size(1).correlationId(gSourceOrderID())
    .timeout(10000)
    .enrich(inheritInbox)
    .to("g:first-matched-suggestion");

In BGIntegrationTest:

@Produce(context = "b", uri = "direct://mock-order")     
private ProducerTemplate bOrderTemplate;        //用于给b提供原始order

@Produce(context = "g", uri = "direct://mock-order")    //用于给g提供原始msg
private ProducerTemplate gOrderTemplate;

bOrderTemplate.sendBodyAndHeader(bOrder(orderId), Ref.INBOX, ref.id());   //bOrder和gOrder都是新构建的,只需set好用于match的field即可。
gOrderTemplate.sendBodyAndHeader(gOrder, Ref.INBOX, ref.id());

In BMock:

from("direct://mock-order").to(report.request(orderLabel())
              .in(content(OrderDataContract.class)), endpoint("pubsub://b-order-updates"));

//从direct://mock-order把order传给真正route里的b://pubsub://b-order-updates。

In GMock:

Samilar route from direct://mock-order to g:pubsub://tibrv-incoming-suggestion.

Another route from g:first-matched-suggestion to mock://matched-suggestion. mock component会存储msg来做future assertions.

Back to BGIntegrationTest:

@EndpointInject(context = "g", uri = "mock://matched-suggestion")
MockEndpoint matchedOrderMock;

matchedOrderMock.reset();
matchedOrderMock.expectedBodiesReceived(galaxyOrder);  //Mock的测试条件

在往初始endpoint produce完msg以后,最后要测试matcher是否将两个msg match成功并存入mock://matched-suggestion.

matchedOrderMock.assertIsSatisfied();

http://camel.apache.org/testing.html

Mock component: 声明期待,确认期待是否满足。期待包括:msg count, msg payload, msg header, msgs order...

The Mock component provides a powerful declarative testing mechanism, which is similar to jMock in that it allows declarative expectations to be created on any Mock endpoint before a test begins. Then the test is run, which typically fires messages to one or more endpoints, and finally the expectations can be asserted in a test case to ensure the system worked as expected.

Remember that Mock is designed for testing. When you add Mock endpoints to a route, each Exchange sent to the endpoint will be stored (to allow for later validation) in memory until explicitly reset or the JVM is restarted.

The following annotations is supported and inject by Camel's CamelBeanPostProcessor

Annotation

Description

@EndpointInject

To inject an endpoint, see more details at POJO Producing.

@BeanInject

Camel 2.13: To inject a bean obtained from the Registry. See Bean Injection.

@PropertyInject

Camel 2.12: To inject a value using property placeholder.

@Produce

To inject a producer to send message to an endpoint. See POJO Producing.

@Consume

To inject a consumer on a method. See POJO Consuming.

[Camel Basics]的更多相关文章

  1. Assembler : The Basics In Reversing

    Assembler : The Basics In Reversing Indeed: the basics!! This is all far from complete but covers ab ...

  2. Camel运行原理分析

    Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...

  3. The Basics of 3D Printing in 2015 - from someone with 16 WHOLE HOURS' experience

    全文转载自 Scott Hanselman的博文. I bought a 3D printer on Friday, specifically a Printrbot Simple Metal fro ...

  4. Cadence UVM基础视频介绍(UVM SV Basics)

    Cadence关于UVM的简单介绍,包括UVM的各个方面.有中文和英文两种版本. UVM SV Basics 1 – Introduction UVM SV Basics 2 – DUT Exampl ...

  5. C basics

    C 日记目录 C basics ................ writing Numeration storage   , structor space assigning pointer,  a ...

  6. Xperf Basics: Recording a Trace(转)

    http://randomascii.wordpress.com/2011/08/18/xperf-basics-recording-a-trace/   This post is obsolete ...

  7. Xperf Analysis Basics(转)

      FQ不易,转载 http://randomascii.wordpress.com/2011/08/23/xperf-analysis-basics/ I started writing a des ...

  8. Radio Basics for RFID

    Radio Basics for RFID The following is excerpted from Chapter 3: Radio Basics for UHF RFID from the ...

  9. 【IOS笔记】View Controller Basics

    View Controller Basics   视图控制器基础 Apps running on iOS–based devices have a limited amount of screen s ...

随机推荐

  1. Qt之属性系统

    简述 Qt提供一个类似于其它编译器供应商提供的复杂属性系统(Property System).然而,作为一个编译器和平台无关的库,Qt不能够依赖于那些非标准的编译器特性,比如:__property或者 ...

  2. Linux基础: 网络命令和进程管理

    ​  netstat lsof ps pstree pkill/kill (了解jenkins git,排查环境) 查询服务器之间是否有链接(netstat -an) 某个服务是否启动(了解服务对应的 ...

  3. file类之目录

    可以解决的问题是:                有时需要列出目录下指定类型的文件,比如java,txt等扩展名的文件,可以使用File类的下述两个方法,列出指定类型的文件. /* file类实现两个 ...

  4. Asp.net 解析json

    Asp.net Json数据解析的一种思路 http://www.cnblogs.com/scy251147/p/3317366.html http://tools.wx6.org/json2csha ...

  5. c#中的常用ToString()方法总结

    c#中的常用ToString()方法总结 对于int,double等的tostring: C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToStri ...

  6. mac 找文件

    如何找到 etc 方法1: ! D# D! s2 F" f 七度苹果电脑软件1.打开Finder,按快键盘 Command + Shift + G,即可调出 前往文件夹 ,也可以左上角 找到 ...

  7. C#入门篇6-6:字符串操作 StringBiulder string char[]之间的转化

    //StringBiulder string char[]之间的转化 public static void Fun3() { StringBuilder sb = new StringBuilder( ...

  8. 如何理解java中的变量和常量

    int a =10;这是一个变量,在后面的代码中你可以去更改a的值但如果你在声明a的时候加上了final,那么a就成了常量,后面的代码是不允许对a做修改的.还有一点你要注意,被final修饰的常量必须 ...

  9. 各种主流数据库的比较(所以说我觉得Oracle这个keng?入的不错?)

    随着计算机技术不断发展,各种数据库编程工具也随着发展,使当今的大多数程序开发人员可以摆脱枯燥无味的用计算机指令或汇编语言开发软件,而是利用一系列高效的.具有良好可视化的编程工具去开发各种数据库软件,从 ...

  10. IOC(控制反转和依赖注入)之Autofac

    Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的.于是,今天抽空研究了下它.下载地址:http://co ...