Apache Camel模拟端点

Iva*_*sul 2 java apache spring apache-camel

我最近开始研究Apache Camel,我有一个问题.我开始为我的路线编写一些测试,并且有很多例子,其中"to"部分路线被写为

    <route id="person-add-route">
        <from uri="direct:start"/>
        <to uri="mock:result"/>
    </route>
Run Code Online (Sandbox Code Playgroud)

所以,我写了一个测试,我正在考虑将mock:result作为last endproint.

@Test
@DirtiesContext
public void testCamel() throws Exception {
    // Given
    Object body = "body";
    int messageCount = 1;
    MockEndpoint endpoint = getMockEndpoint("mock:result");

    // When
    template.sendBody("direct:start", body);

    // Then
    endpoint.expectedMessageCount(messageCount);
    endpoint.assertIsSatisfied();
}
Run Code Online (Sandbox Code Playgroud)

以下是问题:如果我想测试我的路线,那么编写mock是非常重要的吗?

mdn*_*lue 7

您不需要在生产中包含"mock:result",有多种方法可以测试您的路线.一个是isMockEndpoints在你的Camel测试中实现:

@Override
public String isMockEndpoints()
{
     return "*";
}
Run Code Online (Sandbox Code Playgroud)

所以如果你的路线是这样的:

<route id="person-add-route">
    <from uri="direct:start"/>
    <to uri="direct:result"/>
</route>
Run Code Online (Sandbox Code Playgroud)

您可以像这样检查MockEndpoint:

MockEndpoint endpoint = getMockEndpoint("mock:direct:result");
Run Code Online (Sandbox Code Playgroud)

您还可以使用AdviceWith在测试时修改您的路线,方法如下:

context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
    @Override
    public void configure() throws Exception 
    {
         weaveAddLast().to("mock:result");
    }
});
Run Code Online (Sandbox Code Playgroud)

此外,正如克劳斯在评论中提到的,请确保在将信息发送到路线之前设定您的期望.


Pim*_*oek 5

上面(目前已接受)的答案非常旧,可能不再准确。今天实施类似的方法可能看起来像这样:

给定一个定义为 spring 组件的路由:

import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
import java.util.Map;

@Component
public class MyRoute extends RouteBuilder {

    @Override
    public void configure() {
        from("direct:start").routeId("myRoute")
            .setBody().simple("${body} world")
            .process(exchange -> 
                exchange.getIn().setHeaders(Map.of("foo", "bar")));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以按如下方式测试路由:

import org.apache.camel.CamelContext;
import org.apache.camel.EndpointInject;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;

import static org.apache.camel.builder.AdviceWith.adviceWith;
import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
@CamelSpringBootTest
@DirtiesContext
class MyRouteTest {

    @Autowired
    protected CamelContext camelContext;

    @Produce("direct:start")
    private ProducerTemplate from;

    @EndpointInject("mock:result")
    private MockEndpoint mockEndpoint;

    @Test
    void testMyRoute() throws Exception {
        // arrange
        adviceWith(camelContext, "myRoute", 
            route -> route.weaveAddLast().to("mock:result"));
        mockEndpoint.expectedMessageCount(1);

        // act
        from.sendBody("hello");

        // assert
        mockEndpoint.assertIsSatisfied();
        var result = mockEndpoint.getExchanges().get(0).getIn();
        assertThat(result.getBody()).isEqualTo("hello world");
        assertThat(result.getHeader("foo")).isEqualTo("bar");
    }

}
Run Code Online (Sandbox Code Playgroud)

因此route.weaveAddLast().to("mock:result"),基本上所做的就是在路由中编织最后一步,将消息重定向到模拟:结果。