Как выполнить модульное тестирование маршрута apache camel cxfrs?

У меня есть рабочий маршрут cxfrs. Я могу нажать на оставшуюся службу, используя SoapUi с объектом json, и получить ответ.

Я хотел написать модульные тесты и решил использовать CamelTestSupport. Мой метод configure () построителя маршрутов выглядит примерно так:

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

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

Когда я нажимаю URL-адрес из SoapUi (http://localhost:8181/cxf/myContext/submitRequest) как POST с соответствующей строкой json, я получаю ответ "success" 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, которую я вижу в журнале как «Payload:», ничем не отличается от строки json, которую я отправляю через template.requestBodyAndHeader (...).

Что мне не хватает или что я здесь делаю не так?

Спасибо!


person JoeTheSchmoe    schedule 29.11.2017    source источник
comment
Мне кажется, что ваша конечная точка ожидает, что полезная нагрузка поступит в виде XML-запроса, а не JSON. Когда вы переопределяете конечную точку в myRouteBuilder.setCxfrsEndpoint("direct:start");, вы меняете то, как ее ожидает маршрут.   -  person Ricardo Zanini    schedule 04.12.2017
comment
Если вам нужны подробности, я могу предоставить это в качестве ответа.   -  person Ricardo Zanini    schedule 04.12.2017


Ответы (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>

Мое предложение - использовать этот код в качестве примера и вызовите конечную точку напрямую через 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());
}

Если у вас есть шанс, ознакомьтесь со всем _5 _ Проектные тесты, чтобы иметь представление, как правильно тестировать.

person Ricardo Zanini    schedule 04.12.2017
comment
Хорошо, я попробую и сообщу позже сегодня. Спасибо за ответ. - person JoeTheSchmoe; 04.12.2017