如何使用CamelTestSupport模拟对某个预期对象的响应?

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

在构建器方法上创建了一个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());
});
j0pj023g

j0pj023g1#

这听起来完全是意料之中的行为,因为原始消息的正文是null,而您的路由不会将其转换为null
让我们一步一步地描述您的代码,以便更好地理解:
1.该测试方法
下一个代码片段向Consumer终结点direct:getProductById发送一条消息,消息主体为null,消息头id的值为1L,并尝试将结果主体转换为GetProductDetailsDTO类型的对象。

var response = template.requestBodyAndHeader(
        "direct:getProductById",
        null,
        "id",
        1L,
        GetProductDetailsDTO.class
);

1.该路线
您的路由只记录标头id的值,并将使用者终结点direct:getProductById收到的消息按原样发送到生成者终结点mock:result
知道了这一点,我们可以看到,路由实际上将以null作为主体的消息结束,由于Camel无法将null转换为GetProductDetailsDTO类型的对象,因此路由的结果将是null
我猜你的路线是不完整的,因为它应该以某种方式查询您的数据库。

相关问题