Как заглушить конечную точку CXF в Camel Blueprint

Мне нужно написать несколько модульных тестов для маршрутов Camel, которые используют компонент CXF для вызова веб-службы SOAP.
Каков самый простой способ пропустить запрос SOAP и вернуть заглушенный ответ?
Я пытаюсь использовать фиктивные конечные точки, но запрос либо передается реальной конечной точке, либо игнорируется в обратном вызове процессора whenAnyExchangeReceived.

Я настраиваю Camel с помощью Blueprint и запускаю его с помощью camel-test-blueprint 2.17.1. Вот как выглядит моя конфигурация blueprint.xml.

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
    xmlns:camel="http://camel.apache.org/schema/blueprint"
        xmlns:camelcxf="http://camel.apache.org/schema/blueprint/cxf"
    xsi:schemaLocation="
             http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.0.0.xsd
             http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
             http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

    <cm:property-placeholder id="routeConfiguration"
        persistent-id="my.app" />

    <camelcxf:cxfEndpoint id="myWebService"
                  address="${myWebService.url}"
                  wsdlURL="classpath:wsdl/MyWebService.wsdl"
                  serviceClass="my.web.service.Ws"
                  serviceName="s:MyWebServiceImpl"
                  xmlns:s="http://mywebservice.it/"/>


    <camelContext trace="false" id="myCamelContext"
                  xmlns="http://camel.apache.org/schema/blueprint">

        <propertyPlaceholder location="blueprint:routeConfiguration" />

        <route id="IwantToStubInsideHere">
            <from uri="activemq:someQueue"/>
            <to uri="cxf:bean:myWebService"/>
            <to uri="direct:processWebServiceResponse"/>
        </route>

    </camelContext>

</blueprint>    

Тестовый класс

public class RouteTest extends CamelBlueprintTestSupport {
    @Override
    public String isMockEndpointsAndSkip() {
        return "cxf*";
    }

    @Test
    public void testMethod() {
        MockEndpoint mockEndpoint = getMockEndpoint("mock:cxf:bean:myWebService");
        mockEndpoint.expectedMessageCount(1);
        mockEndpoint.whenAnyExchangeReceived(new StubWsProcessor());
        // run route here
    }
}

person Alessandro Da Rugna    schedule 23.05.2016    source источник
comment
Это именно та проблема, с которой мы столкнулись. На данный момент мы не видели другой альтернативы для создания поддельного сервера (например, с SOAP-UI), но мы не пошли по этому пути. На данный момент мы проводим интеграционное тестирование только для этого случая с реальной WS.   -  person рüффп    schedule 21.07.2016
comment
@ruffp Я опубликовал свою фактическую настройку. В моем случае работает очень хорошо, надеюсь, вы сможете адаптировать его к своей ситуации.   -  person Alessandro Da Rugna    schedule 21.07.2016


Ответы (1)


Выкладываю свое решение. Я полностью удалил компонент CXF из своего маршрута и заменил его конечную точку свойством. Во время тестов значение свойства изменяется на соответствующую конечную точку, например. direct:something.
Моя установка немного сложнее, так как включает динамические маршрутизаторы, но вот суть:

<cm:property-placeholder id="routeConfiguration"
                         persistent-id="my.app">
    <cm:default-properties>
        <cm:property name="cxfEndpoint" value="cxf:bean:myWebService"/>
    </cm:default-properties>
</cm:property-placeholder>
.....
<route id="IwantToStubInsideHere">
    <from uri="activemq:someQueue"/>
    <to uri="${cxfEndpoint}"/>
    <to uri="direct:processWebServiceResponse"/>
</route>

Значение по умолчанию подходит для производственного использования и переопределяется только во время тестирования путем определения cxfEndpoint в соответствующем файле my.app.cfg.

person Alessandro Da Rugna    schedule 21.07.2016