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. JavaScript中给对象添加函数的方式

    1. function 类名(){ this.属性: } var 对象名=new 类名(): function 函数名(){ //执行代码 } 对象名.属性名=函数名: 对象名.属性名(): func ...

  2. 张艾迪(创始人):DCM的不识人.我说我会像乔布斯一样成为投资者的骄傲

      Eidyzhang解码:天才Eidyzhang的诞生 张艾迪(创始人):第一个实习生精英团队 张艾迪(创始人):DCM的不识人.我说我会像乔布斯一样成为投资者的骄傲 2014-05-31 09:4 ...

  3. github注册使用以及体会

    一.个人介绍 我叫冯越,学号是1413042065,班级是网络工程143,兴趣爱好有打羽毛球,素描,读书,个人编程能力一般,行数没有计算过,大一学习C++时,实验题目一些书后的题目,大二学习数据结构时 ...

  4. Go语言并发与并行学习笔记(二)

    转:http://blog.csdn.net/kjfcpua/article/details/18265461 Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goro ...

  5. [整理]Linux压缩与解压缩命令整理。

    一.压缩文件命令 1.*.Z compress 程序压缩的档案:2.*.bz2 bzip2 程序压缩的档案:3.*.gz gzip 程序压缩的档案:4.*.tar tar 程序打包的数据,并没有压缩过 ...

  6. 如何打开asp.net中的出错提示?在程序发布后

    答案:修改其中的一个配置节点,<customErrors mode="On"/>

  7. 如何解决链入js,innerHTML中文乱码问题呢?

    描述:发生在做suhuotong网站的时候,添加在线客服代码的时候三个地方1.将js以UTF-8无BOM编码:VS修改或者使用NotePad++修改2.<meta http-equiv=&quo ...

  8. 回车键Enter

    兼容IE与firefox火狐的回车事件(js与jquery) 原生Javascript写法: <script> document.onkeydown=function(event) { e ...

  9. AudioManager音频管理器

    AudioManager音频管理器提供了如下几种常用方法来控制手机音频: 1.adjustStreamVolume(int StreamType,int direction,int flgs):调整手 ...

  10. (转载)全球唯一标识GUID

    GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID ...