在构建器方法上创建了一个DTO(假设它只有一个带有随机值的“name”属性),我想检查返回的对象是否具有相同的值,但响应为空。
单元测试代码:
class GetProductByIdRouteBuilderTest extends CamelTestSupport {
@Test
void testRoute() throws Exception {
var expected = DTOBuilder.getProductDetailsDTO();
getMockEndpoint("mock:result").expectedMessageCount(1);
getMockEndpoint("mock:result").expectedHeaderReceived("id", 1);
var response = template.requestBodyAndHeader(
"direct:getProductById",
null,
"id",
1L,
GetProductDetailsDTO.class
);
assertMockEndpointsSatisfied();
assertEquals(expected.getName(), response.getName());
}
@Override
protected RoutesBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() {
from("direct:getProductById")
.routeId("getProductById")
.log("id = ${header.id}")
.to("mock:result")
.end();
}
};
}
}
解决方案
已使用whenAnyExchangeReceived方法:
getMockEndpoint("mock:result").whenAnyExchangeReceived(exchange -> {
exchange.getMessage().setBody(expected);
exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, HttpStatus.OK.value());
});
1条答案
按热度按时间j0pj023g1#
这听起来完全是意料之中的行为,因为原始消息的正文是
null
,而您的路由不会将其转换为null
。让我们一步一步地描述您的代码,以便更好地理解:
1.该测试方法
下一个代码片段向Consumer终结点
direct:getProductById
发送一条消息,消息主体为null
,消息头id
的值为1L
,并尝试将结果主体转换为GetProductDetailsDTO
类型的对象。1.该路线
您的路由只记录标头
id
的值,并将使用者终结点direct:getProductById
收到的消息按原样发送到生成者终结点mock:result
。知道了这一点,我们可以看到,路由实际上将以
null
作为主体的消息结束,由于Camel无法将null
转换为GetProductDetailsDTO
类型的对象,因此路由的结果将是null
。我猜你的路线是不完整的,因为它应该以某种方式查询您的数据库。