【问题标题】:How to unit test an apache camel cxfrs route?如何对 apache camel cxfrs 路由进行单元测试?
【发布时间】:2017-11-29 21:47:49
【问题描述】:

我有一条有效的 cxfrs 路线。我可以使用带有 json 对象的 SoapUi 访问其余服务并获得响应。

我想编写单元测试,但我想使用 CamelTestSupport。我的 routebuilder configure() 方法如下所示:

    from(cxfrsEndpoint)
        .recipientList(simple("direct:${header.operationName}"))
        .setHeader(Exchange.CONTENT_LENGTH, simple("-1"));

    from("direct:submitRequest")
        .bean("responseBean", "checkJson")
        .bean("responseBean", "createSuccessResponse");

当我将来自 SoapUi (http://localhost:8181/cxf/myContext/submitRequest) 的 URL 作为带有适当 json 字符串的 POST 时,我得到一个“成功”的 json。很酷。

在我的单元测试中,我创建了一个覆盖的 createRouteBuilder 方法:

@Override
protected RouteBuilder createRouteBuilder() {

    MyRouteBuilder myRouteBuilder = new MyRouteBuilder();
    myRouteBuilder.setCxfrsEndpoint("direct:start");
    return myRouteBuilder;
}

然后我的单元测试(我认为)看起来像这样:

@Test
public void thisIsATest() throws Exception {

  MyRequest myRequest = new MyRequest();
  request.setSomeProperty("Some property value");

  ObjectMapper objectMapper = new ObjectMapper();
  String goodJsonRequest = objectMapper.writeValueAsString(request);

  String response = (String) template.requestBodyAndHeader(START_POINT, goodJsonRequest, "operationName", "submitRequest");
  assertNotNull(response);
  //Omitted: further assertions for content of the response json
}

好吧,当我执行单元测试时,我得到一个解组异常,原因如下:

Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '{' (code 123) in prolog; expected '<'
  at [row,col {unknown-source}]: [1,1]
  at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:647)
  at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2054)
  at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1131)
  at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:164)
  at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:415)
... 74 more

它不喜欢我的 json 字符串。真正接受的服务是什么?

在真实路由上,我在 blueprint.xml 中启用了端点日志记录,如下所示:

<!-- RouteBuilder declarations -->
<bean id="myRouteBuilder" class="com.mycompany.MyRouteBuilder">
  <property name="cxfrsEndpoint"  value="cxfrs:bean:cxfrsEndpoint?bindingStyle=SimpleConsumer&amp;loggingFeatureEnabled=true" />
</bean>

我在日志中看到的作为“有效负载:”的 json 字符串与我通过 template.requestBodyAndHeader(...) 发送的 json 字符串看起来没有任何不同。

我错过了什么或者我做错了什么?

谢谢!

【问题讨论】:

  • 在我看来,您的端点期望有效负载以 XML 请求的形式出现,而不是 JSON。当您覆盖 myRouteBuilder.setCxfrsEndpoint("direct:start"); 中的端点时,您正在更改路由的预期方式。
  • 如果您需要更多详细信息,我可以将其公开为答案。

标签: json unit-testing apache-camel cxfrs


【解决方案1】:

请尽量不要像这样重写您的端点:

myRouteBuilder.setCxfrsEndpoint("direct:start");

在我看来,覆盖您的端点会更改接口,而 CXF 现在需要的是 XML 而不是 JSON(基于您的日志):

Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '{' (code 123) in prolog; expected '<'
at [row,col {unknown-source}]: [1,1]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:647)
at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2054)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1131)
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:164)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:415)
... 74 more

您已经在此处定义了端点:

<bean id="myRouteBuilder" class="com.mycompany.MyRouteBuilder">
      <property name="cxfrsEndpoint"  value="cxfrs:bean:cxfrsEndpoint?bindingStyle=SimpleConsumer&amp;loggingFeatureEnabled=true" />
</bean>

我的建议是使用this code 作为示例,并通过 HTTP 直接调用您的端点:

public void setUp() throws Exception {
    super.setUp();
    httpclient = HttpClientBuilder.create().build();
}

public void tearDown() throws Exception {
    super.tearDown();
    httpclient.close();
}

@Test
public void testGetCustomerOnlyHeaders() throws Exception {
    HttpGet get = new HttpGet("http://serviceurl.com");
    HttpResponse response = httpclient.execute(get);
    assertEquals(200, response.getStatusLine().getStatusCode());
}

如果有机会,请查看整个 camel-cxf 项目测试,了解如何正确测试。

【讨论】:

  • 好的,我会试一试,今天晚些时候回来报告。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 2017-07-05
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多