IAm*_*aja 4 java unit-testing apache-camel spring-test
我们使用Spring for DI和Camel进行路由/消息传递.我被要求为我们的各种组件设置一些(JUnit)单元测试(所有组件都以管道方式将消息路由到另一个组件).
在对一般的Camel测试文档和Camel-Spring测试文档进行了研究之后,看起来单元测试camel端点的首选方法是通过Spring Test Context Framework使用对象的子类AbstractJUnit38SpringContextTests
和类型.
我绝对没有任何这些API的经验.所以,虽然他们有趣的阅读,但我很难把它们放到上下文中(没有双关语).
因此,我正在努力解决一些初步概念:
首先,何时使用a MockEndpoint
,vs DataSet
,vs Test
?
此外,Camel-Spring doc(链接在上面)提供了以下示例:
@ContextConfiguration
public class MyCamelTest extends AbstractJUnit38SpringContextTests {
@Autowired
protected CamelContext camelContext;
@EndpointInject(uri = "mock:foo")
protected MockEndpoint foo;
public void testMocksAreValid() throws Exception {
// lets add more expectations...
MockEndpoint.assertIsSatisfied(camelContext);
// now lets do some further assertions
List<Exchange> list = foo.getReceivedExchanges();
for (Exchange exchange : list) {
Message in = exchange.getIn();
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我甚至开始理解这个API,那么它上面的代码似乎正在读取来自MockEndpoint
命名的所有消息mock:foo
...但我不知道这些消息来自何处(它们如何到达端点)第一名)!
所以我的第二个问题是:确定哪些端点为"stub"(模拟)的标准做法是什么?例如,如果生活在两个不同JAR/WAR中的两个端点使用相同的JMS消息队列,那么:一个是生产者而另一个是消费者?在这种情况下,ProducerComponent
(生活在内部producer.war
)是一个将消息推送到的Camel端点someQueue
.而且ConsumerComponent
(生活在里面consumer.war
)是消费消息的另一个Camel端点someQueue
.
SO如何组织两个组件的单元测试?
提前感谢任何正确方向的推动!
小智 6
优秀的做法,彻底测试您的路线.您提到的Camel测试和Spring测试资源可能是最好的起点.现在,使用Spring或不使用Spring也取决于您设置路由的方式,即使用Spring XML dsl或Java dsl.显然CamelSpringTestSupport(甚至是AbstractJUnit38SpringContextTests)可能更适合前者,对于后者你可能更喜欢CamelTestSupport.现在回答你的问题:
何时适合使用MockEndpoint,vs DataSet,vs?它并非真正"对抗",它们都扮演不同的角色,您可以根据需要一起使用它们.测试不是Camel特有的,它只是常规的JUnit测试.Camel提供了一些特殊化和实用程序来简化测试(CamelTestSupport等).通常(并非总是),您可以使用Camel进行系统集成,轻量级业务流程或工作流等,利用Camel定义的强大EIP(企业集成模式)以及对无数协议和数据格式的支持.在测试期间,您可以向某个端点发送消息,但是如何确保您的处理正确并且收到的消息是预期的消息?为此,Camel提供了MockEndpoint,您可以(应该在测试期间)用作目标端点的替代品.通过这种方式,您可以使用断言来确保收到的消息是您所期望的消息,正确的顺序,时间等.查看属性组件,以便在不同的测试(或生产)环境中替换端点的便捷方式.DataSet是一种触发或验证一系列消息的便捷方式.
确定哪些端点为"存根"的标准做法是什么?通常的工作方式是同意消息格式以及前后条件,即您可以测试生产者是否独立于消费者生成所需的消息,您甚至不必使用相同的协议(您可以发送例如,如上所述的消息,如MockEndpoint).这会让你对制片人做正确的事情充满信心.同样,您也可以独立测试消费者.可能的情况是,当放在一起时一切都会起作用,如果没有,你的测试中可能会遗漏一些东西.大多数情况下,并非所有东西都可以进行单元测试,并且拥有与您的生产环境更相似的集成测试是一种很好的做法.
如果你有更具体的问题,我可以给你更具体的建议.我希望这有帮助.