Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache骆驼测试_Java_Unit Testing_Apache Camel_Spring Test - Fatal编程技术网

Java Apache骆驼测试

Java Apache骆驼测试,java,unit-testing,apache-camel,spring-test,Java,Unit Testing,Apache Camel,Spring Test,我们将Spring用于DI,将Camel用于路由/消息传递。我被要求为我们的各种组件设置一些(JUnit)单元测试(它们都以管道方式将消息路由到另一个组件) 在浏览了一般文档和文档之后,单元测试camel端点的首选方法似乎是通过Spring测试上下文框架,使用对象的子类,如AbstractJUnit38SpringContextTests和排序 我绝对没有使用这些API的经验。所以,尽管它们能带来有趣的阅读,但我很难把它们放在上下文中(没有双关语) 因此,有几个最初的概念我正在努力解决: 例如,

我们将Spring用于DI,将Camel用于路由/消息传递。我被要求为我们的各种组件设置一些(JUnit)单元测试(它们都以管道方式将消息路由到另一个组件)

在浏览了一般文档和文档之后,单元测试camel端点的首选方法似乎是通过Spring测试上下文框架,使用对象的子类,如
AbstractJUnit38SpringContextTests
和排序

我绝对没有使用这些API的经验。所以,尽管它们能带来有趣的阅读,但我很难把它们放在上下文中(没有双关语)

因此,有几个最初的概念我正在努力解决:

例如,何时使用
模拟端点
、vs
数据集
、vs
测试

此外,Camel-Spring文档(链接在上面)提供了以下示例:

@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();
            ...
        }       
    }
}
@ContextConfiguration
公共类MyCamelTest扩展了AbstractJUnit38SpringContextTests{
@自动连线
受保护的上下文和上下文;
@端点注入(uri=“mock:foo”)
受保护的mockfoo;
public void testMocksAreValid()引发异常{
//让我们添加更多的期望。。。
MockEndpoint.Assertessatified(camelContext);
//现在让我们做一些进一步的断言
List=foo.getReceivedExchanges();
用于(交换:列表){
Message in=exchange.getIn();
...
}       
}
}
如果我甚至开始理解这个API,那么它上面的代码似乎从名为
mock:foo
MockEndpoint
读取所有消息……但我看不到这些消息来自何处(它们首先是如何到达端点的)

所以我的第二个问题是::确定“存根”(mock)的端点的标准实践是什么?例如,如果生活在两个不同JAR/WAR中的两个端点使用相同的JMS消息队列:一个是生产者,另一个是消费者,该怎么办?在这种情况下,
ProducerComponent
(生活在
producer.war
中)是一个驼峰端点,它将消息推送到
someQueue
。而
ConsumerComponent
(生活在
consumer.war
中)是另一个骆驼端点,它从
someQueue
消费消息

如何组织这两个组件的单元测试?


提前感谢您在正确方向上的任何推动

中的测试章节非常好。我只是扩展了CamelTestSupport,并使用mock作为路由的虚拟输入或输出(我不担心Spring或注入之类的东西)。还有一堆奇特的东西,你可以通过把东西(我忘了它们叫什么)放在组件之间的路径上来模拟失败等等。我强烈推荐这本书,它非常清晰准确

对于第二个问题,我想这取决于您的消息是如何创建的。您可以使用模拟端点从队列中馈送或消费(或两者兼而有之)。在模拟端点中有很多很好的支持来检查消息


CamelTestSupport及其超类有许多有用的方法来创建消息。

彻底测试路由的最佳实践。您提到的Camel测试和Spring测试资源可能是最好的起点。现在,是否使用Spring进行测试还取决于您设置路由的方式,即使用SpringXMLDSL或JavaDSL。显然,CamelSpringTestSupport(甚至AbstractJUnit38SpringContextTests)可能更适合前者,对于后者,您可能更喜欢CamelTestSupport。现在回答你的问题:

  • 何时使用MockEndpoint、vs DataSet、vs Test合适? 这不是真正的“对抗”,它们都扮演不同的角色,你可以根据需要将它们结合使用。测试不是特定于Camel的,它只是常规的JUnit测试。Camel提供了一些专门化和实用程序来简化测试(CamelTestSupport等)。通常(并非总是)您会使用Camel进行系统集成、类似于轻量级业务流程或工作流,利用Camel定义的强大eip(企业集成模式)以及对无数协议和数据格式的支持。在测试过程中,您可以向某个端点发送消息,但如何确保您的处理是正确的,并且收到的消息是预期的?为此,Camel提供了MockEndpoint,您可以(应该在测试期间)将其用作目标端点的替代品。通过这种方式,您可以使用断言来确保收到的消息是您期望的消息,顺序、时间等都正确。请查看,以寻找在不同测试(或生产)环境中替换端点的方便方法。数据集是触发或验证一系列消息的方便方法

  • 确定要“存根”的端点的标准实践是什么?通常有效的方法是就消息格式和前置和后置条件达成一致,即,您可以测试生产者是否独立于使用者生成所需的消息,并且您甚至不必使用相同的协议(例如,您可以将消息发送到上面提到的MockEndpoint)。这将给你一个很好的信心,生产者正在做正确的事情。同样,您也可以独立测试消费者。很有可能,当把所有的东西放在一起时,一切都会起作用,如果不起作用,你的测试中可能会遗漏一些东西。大多数情况下,并不是所有的东西都可以进行单元测试,最好进行与生产环境更相似的集成测试

  • 如果你有更具体的问题,我可以给你更具体的建议。我希望这有帮助