I wanted to verify if the approach below is the correct one regarding Camel
cxfEndpoint usage and testability.

I have a camelRoute using an cxfEndpoint (payload dataformat) to consume
webservice messages.

        <cxf:cxfEndpoint id="soapMessageEndpoint"
                                          
address="http://localhost:9080/app/webservices/service1";
                          endpointName="s:SoapOverHttpRouter"
                          serviceName="s:SOAPService"
                          xmlns:s="http://apache.org/service_soap_http";>
                          
                <cxf:properties>
                        <entry key="dataFormat" value="PAYLOAD"/>
                </cxf:properties>
        
        </cxf:cxfEndpoint>

        <from uri="cxf:bean:soapMessageEndpoint"/>

I can "unit test" this route using a CamelSpringTestSupport testcase easily
as the cxfEndpoint component starts an 
embedded jetty server and I can have my test send SOAP messages over this
embedded HTTP server.
It's not really a unit test, but it runs it in a J2SE environment without
too much dependencies.

We deploy the route on an JEE application server, so our target environment
is a JEE container.
When deployed in a JEE container I'm not using the embedded jetty but I'm
using the CXFServlet (the route is bootstrapped from a WAR file). 

        
        <servlet>
                <servlet-name>CXFServlet</servlet-name>
                
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
                <load-on-startup>1</load-on-startup>
        </servlet>

        
        <servlet-mapping>
                <servlet-name>CXFServlet</servlet-name>
                <url-pattern>/webservices/*</url-pattern>
        </servlet-mapping>

As a consequence, the route definition is a bit different. In the JEE
environment I don't need the cxfEndpoint component, but rather use a from
uri like this:

        <from uri="cxf://service1?dataFormat=PAYLOAD"/>

I'm looking for a way to have 1 single camel route definition that can be
used in the JEE container, but also used in a standalone J2SE environment
for testing.

As such, I've created a single Camel route that I used both for unit testing
and at runtime in the container.
For the unit test, I'm using an adviceWith/replaceFromWith to replace the
original from (cxf://service1?dataFormat=PAYLOAD , used by the JEE
container) 
with a from suitable for unit testing (cxf:bean:soapMessageEndpoint).

                        private static final String UNITTEST_ENDPOINT_NAME =
"cxf:bean:soapMessageEndpoint";

                        CamelContext camelContext = createCamelContext(); 
                        RouteDefinition routeDefinition =
camelContext.getRouteDefinition(FLOW_ID);
                        if
(!UNITTEST_ENDPOINT_NAME.equals(routeDefinition.getInputs().get(0).getUri()))
{
                                routeDefinition.adviceWith(camelContext, new 
AdviceWithRouteBuilder()
                                {
                                        
                                        @Override
                                        public void configure() throws Exception
                                        {
                                                
replaceFromWith(UNITTEST_ENDPOINT_NAME);
                                                
                                        }
                                });
                        }
                        
Is this the correct way of handling this ?



--
View this message in context: 
http://camel.465427.n5.nabble.com/Camel-cxfEndpoint-testing-guidelines-tp5731082.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to