Spring 测试基于 Camel 内容的路由器

Spring Testing a Camel Content Based Router

我有以下 Spring 路线:

 <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="activemq:topic:inbox" />
            <choice>
                <when>
                    <simple>${in.header.Value}</simple>
                    <log message="Cc: ${in.header.Value}" />
                </when>
            </choice>
            <to uri="mock:result" />
        </route>
 </camelContext>

我有使用 Spring 测试(CamelSpringJUnit4ClassRunner)的要求,尽管我找到了有关如何使用 [= 测试条件的易于理解的示例24=] DSL。我的测试 Class 是这样的:

@RunWith(CamelSpringJUnit4ClassRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@ContextConfiguration(locations = "file:src/main/resources/META-INF/spring/camel-context-activemq-embedded.xml")
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
@MockEndpoints("log:*")
@DisableJmx(false)

public class MyTest{

    private Logger LOG = LogManager.getLogger(MyTest.class.getName());

    protected Exchange exchange;
    protected CustomComponent customComponent= new CustomComponent();

    @Produce(uri = "activemq:topic:inbox")
    protected ProducerTemplate template;

    @EndpointInject(uri = "mock:result")
    protected MockEndpoint resultEndpoint;

@Test
    public void tes1() throws InterruptedException {
        String headerValue= MyComponent.Value;
        EmailAddress recipients = new EmailAddress("recipient@example.com");
        template.sendBodyAndHeader("activemq:topic:inbox", recipients.toString(), headerValue);
        resultEndpoint.expectedBodiesReceived(headerValue);
        resultEndpoint.expectedHeaderReceived("header value", headerValue);
        resultEndpoint.expectedMessageCount(1);
    }

我很难理解如何测试 CBR 规定的实际情况,但更重要的是,我怀疑这是否是正确的测试方法。 MyComponent.VALUEConstant 是在我的自定义组件中指定的 属性 并且上面的测试实际上是通过的。但是,如果我在我的组件上用不同的 属性 实例化了 headerValue 并且因此条件应该失败,则测试通过。你能帮忙吗?

谢谢,

嗯,我首先看到的是你的简单表达式缺少比较 - 它可能应该是 ${in.header.value} == 'wanted value'

就测试而言——这实际上取决于测试的类型。在这里,你正在进行集成测试,所以我会验证效果是否符合预期 - 数据库改变了它应该的方式等。但是由于你的路线只做一些日志记录,所以我会改变:

<log message="Cc: ${in.header.Value}" />

进入

<log message="Cc: ${in.header.Value}" />
<to uri="mock:choice-triggered" />

然后验证 mock:choice-triggered 端点是否收到消息(或未收到,具体取决于场景)。但是在对真实世界路由的测试中,您可能想要验证是否已将某些数据插入数据库或已将某些消息发布到 MQ,或者是否已发送电子邮件。

就您的常量而言,我建议您使用外部化属性 - Camel and Spring 都对 属性 占位符有很好的支持,我建议您尝试一下。