使用mockEndpointsAndSkip()的Apache Camel测试未接收消息,但weaveById().replace().to()接收消息

anauzrmj  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(181)

我尝试过对Apache Camel进行单元测试,我从一个真实的的基本案例开始,我的路径看起来像这样:

public class TestRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("jpa:Data").to("jpa:Data").id("testId");
    }
}

现在,以下方法不起作用。我尝试模拟所有端点,但得到的结果是mock://jpa:Data Received message count. Expected: <1> but was: <0>

public class RouteTest extends CamelTestSupport {
    @Override
    @BeforeEach
    public void setUp() throws Exception {
        super.setUp();
    }

    @Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        return new TestRoute();
    }

    @Override
    public boolean isUseAdviceWith() {
        return true;
    }

    @Test
    void testRoute() throws Exception {
        AdviceWith.adviceWith(context, null, false, a -> {
            a.replaceFromWith("direct:start");
            a.mockEndpointsAndSkip("*");
        });
        context.start();
        // The false here makes sure that I get an exception if I'm using a name 
        // of a nonexistent mocked endpoint, so that shouldn't be the problem here
        getMockEndpoint("mock:jpa:Data", false).expectedMessageCount(1);

        var data = getSomeTestData();
        template.sendBody("direct:start", data);
        assertMockEndpointsSatisfied();
    }
}

我发现的一个解决方法是用a.weaveById("testId").replace().to("mock:jpa:Data");替换a.mockEndpointsAndSkip("*");。但是我不确定在这种情况下有什么区别,因为mockEndpointsAndSkip也应该用模拟版本替换所有端点。在真实的场景中手动替换所有端点会有点麻烦。

kq4fsx7k

kq4fsx7k1#

这是因为,通过使用*作为要模拟的端点URI的模式,您还包括了您的 from 端点direct:start,这意味着它也被模拟了,因此消息不会传输到路由的其余部分,因此mock:jpa:Data不会接收任何消息。
请使用更具体的模式,仅与您的 to 端点匹配,如jpa:Data
仅供参考,您可以通过利用现有方法(如replaceRouteFromWithisMockEndpointsAndSkip)来简化代码,如下所示:

@Override
@BeforeEach
public void setUp() throws Exception {
    // The new from endpoint for the route "testId"
    replaceRouteFromWith("testId", "direct:start");
    super.setUp();
}

@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
    return new TestRoute();
}

@Override
public String isMockEndpointsAndSkip() {
    // The pattern of the URI of endpoints to mock 
    return "jpa:Data";
}

@Test
void testRoute() throws Exception {
    MockEndpoint mockEndpoint = getMockEndpoint("mock:jpa:Data")
    mockEndpoint.expectedMessageCount(1);

    var data = getSomeTestData();
    template.sendBody("direct:start", data);
    mockEndpoint.assertIsSatisfied();
}

相关问题