java - Apache Camel - 定义在管道上没有孩子
问题描述
这是我的简单路线:
@Override
public void configure() {
onException(Exception.class)
.handled(true)
.process(exchange -> {
Exception exception = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
log.error(logFormat.error(exchange, exception, exception.getMessage()));
exchange.getIn().setBody(exception.getMessage());
exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, HttpStatus.SC_INTERNAL_SERVER_ERROR);
});
onException(HttpOperationFailedException.class)
.handled(true)
.to("direct:handleHttpOperationFailed");
from("direct:myRoute")
.routeId("myRoute")
.log("Route start: myRoute")
.id("startStep")
.process(
exchange -> log.info("Doing some processing")
)
.id("processingStep")
.end();
}
现在我想写一些测试:
- 异常处理案例——在“processingStep”之后抛出异常,在onException中处理
- 积极的情况 - 所有流程都毫无例外地通过
这就是我所做的......
我的测试注释:
@RunWith(CamelSpringBootRunner.class)
@UseAdviceWith
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class StarlingFpsInboundWebhookIT {
...
}
我的两个测试用例:
- 有异常情况——这里我使用adviceWith在“processingStep”之后抛出异常:
@Test
public void exceptionScenario() throws Exception {
// Given
context.getRouteDefinition("myRoute").adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() {
weaveById("processingStep").after()
.process(exchange -> {
throw ExceptionFixtures.createSimpleException();
})
.id("exceptionThrowStep");
}
});
context.start();
String requestBody = ResourcesHelper.read(this.getClass(), "/data/input/request.json");
// When
template.send("direct:myRoute", camelExchange -> {...});
}
- 成功案例 - 这里我需要删除之前创建的“exceptionThrowStep”以不抛出异常:
@Test
public void successScenario() throws Exception {
// Given
context.getRouteDefinition("myRoute").adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() {
weaveById("exceptionThrowStep").remove();
}
});
context.start();
String requestBody = ResourcesHelper.read(this.getClass(), "/data/input/request.json");
// When
template.send("direct:myRoute", camelExchange -> {...});
}
当我运行这些测试(第一个异常然后成功场景)时,我在第二个测试中得到异常:
org.apache.camel.FailedToCreateRouteException:
Failed to create route myRoute at:
>>> pipeline -> [[]] <<<
in route: Route(myRoute)[[From[direct:myRoute]...
because of Definition has no children on pipeline -> [[]]
为什么会出现这个异常?我已经阅读了很多文章,但没有发现任何关于这个案例的宝贵信息 :( 有趣的是 - 当我在 adviceWith 的第二次测试中使用 replace() 而不是 remove() 时,一切正常......
我的问题是:
- 是在路由中测试异常处理的好方法吗?
- 我们可以在测试之间重置路由定义以避免我的方法吗?
解决方案
我从你最后的两个问题开始:
- 是的,最好同时测试路线的错误路径,而不仅仅是快乐路径
- 是的,您可以并且应该在测试之间重置路由定义。由于您运行
SpringBootTest
s ,因此您可以使用DirtiesContext
注释(Spring Test Framework 的一部分)来完成
例子:
@Test
@DirtiesContext
public void successScenario() throws Exception {
默认情况下,这会在运行带注释的测试后重置 Camel 路由。
您的测试不能依赖于特定的顺序才能成功运行!这会导致不稳定的测试结果并降低您对测试的信心。
一般来说,您的成功测试不需要任何路由修改,因为这是预期的处理路径。对于错误测试,你必须在你的路由中注入错误(就像你使用adviceWith做的那样)来模拟处理错误。
推荐阅读
- nginx - Nginx reduce repeat directive
- django - Django ORM:如何在聚合结果上应用函数?
- c# - Rebus.Async with SimpleInjector Request/Reply MessageCouldNotBeDispatchedToAnyHandlersException
- typo3 - Typo3 10.4.4 Gridelements 10.0.0 扩展不起作用
- r - 通过终端/控制台保存脚本运行 Rscript 的历史记录
- spring - 如何在 Spring Batch 中使用 ClassifierCompositeItemProcessor 并将数据写入同一个表以进行 Insert 和 Upsert?
- oracle - 如何循环遍历表列中字段的值?
- perl - 套接字读取设备的 ioctl 不合适
- jquery - StepIndex 的值错误
- powershell - 在 vscode 中为 PowerShell 7 启用语法突出显示?