我尝试过对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
也应该用模拟版本替换所有端点。在真实的场景中手动替换所有端点会有点麻烦。
1条答案
按热度按时间kq4fsx7k1#
这是因为,通过使用
*
作为要模拟的端点URI的模式,您还包括了您的 from 端点direct:start
,这意味着它也被模拟了,因此消息不会传输到路由的其余部分,因此mock:jpa:Data
不会接收任何消息。请使用更具体的模式,仅与您的 to 端点匹配,如
jpa:Data
。仅供参考,您可以通过利用现有方法(如
replaceRouteFromWith
和isMockEndpointsAndSkip
)来简化代码,如下所示: