You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by David Karlsen <da...@gmail.com> on 2013/11/27 19:22:38 UTC

LocalTransport for integration testing

Hi.

I´ve looked at
https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing#JAXRSTesting-LocalTransportfor
information on howto test JAX-RS services.

I´d like the LocalTransport approach (so I don´t have to configure TCP
ports etc), but I´d like to use springs test support (@ContextConfiguration
etc) and only add the LocalTransport configuration.

I´d also like to reuse the spring context file as it will look when
using/packaging it into a .war, which looks like:

  <jaxrs:server address="/v1">
        <jaxrs:serviceBeans>
            <ref bean="trackService" />
            <ref bean="blobService" />
        </jaxrs:serviceBeans>
        <jaxrs:providers>
            <bean
class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
            <ref bean="serviceExceptionMapper" />
        </jaxrs:providers>
        <jaxrs:properties>
            <entry key="mtom-enabled" value="true" />
        </jaxrs:properties>
    </jaxrs:server>

Is it possible to configure only the LocalTransport stuff in my test, and
inject the configured Server from the context file with spring?

-- 
--
David J. M. Karlsen - http://www.linkedin.com/in/davidkarlsen

Re: LocalTransport for integration testing

Posted by Mandy Warren <ma...@gmail.com>.
Apologies you are right I just tried removing it and don't need it! Makes things even simpler!

Many thanks and sorry for confusing!

Sent from a mobile device

> On 1 Dec 2013, at 17:37, Andrei Shakirin <as...@talend.com> wrote:
> 
> Just out of curiosity: do you really need to define LocalTransportFactory bean?
> Doesn't that work for you just with configurable local address "local://abcd " or do you have some special reason to redefine LocalTransportFactory?
> 
> Regards,
> Andrei.
> 
>> -----Original Message-----
>> From: Mandy Warren [mailto:mandys.inbox@gmail.com]
>> Sent: Samstag, 30. November 2013 20:14
>> To: users@cxf.apache.org
>> Subject: Re: LocalTransport for integration testing
>> 
>> Just adding a few more comments as we have exactly this setup with our
>> projects. We're using Maven and have a spring file (main-
>> applicationContext.xml)under src/main/resources defining the jaxrs bean
>> with the property placeholder as Sergey has specified. This references a
>> properties file with the actual address defined.
>> 
>> We've then got another Spring file (IntegrationTestsAppContext.xml) under
>> src/integrationtest/resources which also has a property placeholder, pointing
>> to another properties file with the local: address specified. This Spring file
>> imports the main Spring file (so we get all the jaxrs bean detail):
>> 
>>   <import
>>       resource="classpath:conf/spring/main-applicationContext.xml" />
>> 
>> and specifies this bean to enable local transport (we don't want this for live
>> hence defining it in the integration test spring config).
>> 
>>       <bean class="org.apache.cxf.transport.local.LocalTransportFactory"
>>           lazy-init="false">
>>           <property name="transportIds">
>>               <list>
>>                   <value>http://cxf.apache.org/transports/local</value>
>>               </list>
>>           </property>
>>       </bean>
>> 
>> We then run our tests as follows:-
>> 
>> @RunWith(SpringJUnit4ClassRunner.class)
>> @ContextConfiguration({
>> "classpath:conf/spring/IntegrationTestsAppContext.xml" })
>> @DirtiesContext(classMode =
>> DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
>> public class MyIntegrationTests {
>>   // Must match the overridden local endpoint.address
>>   private final static String ENDPOINT_ADDRESS = "local://abcd";
>> 
>>   @Test
>>   public void testStuff() throwsException {
>>   WebClient client = WebClient.create(ENDPOINT_ADDRESS);
>>       WebClient.getConfig(client).getRequestContext()
>>               .put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
>> 
>>       Response response = client
>>               .path("v1/some/path/to/your/service")
>>               .type(MediaType.APPLICATION_XML)
>>               .accept(MediaType.APPLICATION_XML)
>>               .matrix("date", "2013-11-30")
>>               .get(Response.class);
>> 
>>   // do some asserts on the response
>> 
>> }
>> 
>> CXF makes it very nice and easy!
>> 
>> Hope this helps
>> 
>> Mandy
>> 
>> Sent from a mobile device
>> 
>>>> On 28 Nov 2013, at 10:59, Sergey Beryozkin <sb...@gmail.com>
>>> wrote:
>>> 
>>> Hi
>>>> On 27/11/13 18:22, David Karlsen wrote:
>>>> Hi.
>>>> 
>>>> I´ve looked at
>> https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing#JA
>>>> XRSTesting-LocalTransportfor information on howto test JAX-RS
>>>> services.
>>>> 
>>>> I´d like the LocalTransport approach (so I don´t have to configure
>>>> TCP ports etc), but I´d like to use springs test support
>>>> (@ContextConfiguration
>>>> etc) and only add the LocalTransport configuration.
>>>> 
>>>> I´d also like to reuse the spring context file as it will look when
>>>> using/packaging it into a .war, which looks like:
>>>> 
>>>>  <jaxrs:server address="/v1">
>>>>        <jaxrs:serviceBeans>
>>>>            <ref bean="trackService" />
>>>>            <ref bean="blobService" />
>>>>        </jaxrs:serviceBeans>
>>>>        <jaxrs:providers>
>>>>            <bean
>>>> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
>>>>            <ref bean="serviceExceptionMapper" />
>>>>        </jaxrs:providers>
>>>>        <jaxrs:properties>
>>>>            <entry key="mtom-enabled" value="true" />
>>>>        </jaxrs:properties>
>>>>    </jaxrs:server>
>>>> 
>>>> Is it possible to configure only the LocalTransport stuff in my test,
>>>> and inject the configured Server from the context file with spring?
>>> The initialized server in this case will already HTTP Destination
>>> attached to it by default, so you can try to parameterize either the
>>> address or transportId attribute, for example, you'd have either
>>> 
>>> <jaxrs:server address="${prefix}/v1">
>>> 
>>> and default to "" and set to "local://" for tests
>>> 
>>> or
>>> 
>>> <jaxrs:server address="/v1" transportId=${transportId}>
>>> 
>>> default to "http://cxf.apache.org/transports/http" and set to
>>> "http://cxf.apache.org/transports/local" for tests.
>>> 
>>> I've update the wiki to show how to create the clients in the latter case:
>>> https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing
>>> (see at the end)
>>> 
>>> HTH, Sergey
>>> 
>>> 

RE: LocalTransport for integration testing

Posted by Andrei Shakirin <as...@talend.com>.
Just out of curiosity: do you really need to define LocalTransportFactory bean?
Doesn't that work for you just with configurable local address "local://abcd " or do you have some special reason to redefine LocalTransportFactory?

Regards,
Andrei.

> -----Original Message-----
> From: Mandy Warren [mailto:mandys.inbox@gmail.com]
> Sent: Samstag, 30. November 2013 20:14
> To: users@cxf.apache.org
> Subject: Re: LocalTransport for integration testing
> 
> Just adding a few more comments as we have exactly this setup with our
> projects. We're using Maven and have a spring file (main-
> applicationContext.xml)under src/main/resources defining the jaxrs bean
> with the property placeholder as Sergey has specified. This references a
> properties file with the actual address defined.
> 
> We've then got another Spring file (IntegrationTestsAppContext.xml) under
> src/integrationtest/resources which also has a property placeholder, pointing
> to another properties file with the local: address specified. This Spring file
> imports the main Spring file (so we get all the jaxrs bean detail):
> 
>    <import
>        resource="classpath:conf/spring/main-applicationContext.xml" />
> 
> and specifies this bean to enable local transport (we don't want this for live
> hence defining it in the integration test spring config).
> 
>        <bean class="org.apache.cxf.transport.local.LocalTransportFactory"
>            lazy-init="false">
>            <property name="transportIds">
>                <list>
>                    <value>http://cxf.apache.org/transports/local</value>
>                </list>
>            </property>
>        </bean>
> 
> We then run our tests as follows:-
> 
> @RunWith(SpringJUnit4ClassRunner.class)
> @ContextConfiguration({
> "classpath:conf/spring/IntegrationTestsAppContext.xml" })
> @DirtiesContext(classMode =
> DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
> public class MyIntegrationTests {
>    // Must match the overridden local endpoint.address
>    private final static String ENDPOINT_ADDRESS = "local://abcd";
> 
>    @Test
>    public void testStuff() throwsException {
>    WebClient client = WebClient.create(ENDPOINT_ADDRESS);
>        WebClient.getConfig(client).getRequestContext()
>                .put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
> 
>        Response response = client
>                .path("v1/some/path/to/your/service")
>                .type(MediaType.APPLICATION_XML)
>                .accept(MediaType.APPLICATION_XML)
>                .matrix("date", "2013-11-30")
>                .get(Response.class);
> 
>    // do some asserts on the response
> 
> }
> 
> CXF makes it very nice and easy!
> 
> Hope this helps
> 
> Mandy
> 
> Sent from a mobile device
> 
> > On 28 Nov 2013, at 10:59, Sergey Beryozkin <sb...@gmail.com>
> wrote:
> >
> > Hi
> >> On 27/11/13 18:22, David Karlsen wrote:
> >> Hi.
> >>
> >> I´ve looked at
> >>
> https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing#JA
> >> XRSTesting-LocalTransportfor information on howto test JAX-RS
> >> services.
> >>
> >> I´d like the LocalTransport approach (so I don´t have to configure
> >> TCP ports etc), but I´d like to use springs test support
> >> (@ContextConfiguration
> >> etc) and only add the LocalTransport configuration.
> >>
> >> I´d also like to reuse the spring context file as it will look when
> >> using/packaging it into a .war, which looks like:
> >>
> >>   <jaxrs:server address="/v1">
> >>         <jaxrs:serviceBeans>
> >>             <ref bean="trackService" />
> >>             <ref bean="blobService" />
> >>         </jaxrs:serviceBeans>
> >>         <jaxrs:providers>
> >>             <bean
> >> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
> >>             <ref bean="serviceExceptionMapper" />
> >>         </jaxrs:providers>
> >>         <jaxrs:properties>
> >>             <entry key="mtom-enabled" value="true" />
> >>         </jaxrs:properties>
> >>     </jaxrs:server>
> >>
> >> Is it possible to configure only the LocalTransport stuff in my test,
> >> and inject the configured Server from the context file with spring?
> > The initialized server in this case will already HTTP Destination
> > attached to it by default, so you can try to parameterize either the
> > address or transportId attribute, for example, you'd have either
> >
> > <jaxrs:server address="${prefix}/v1">
> >
> > and default to "" and set to "local://" for tests
> >
> > or
> >
> > <jaxrs:server address="/v1" transportId=${transportId}>
> >
> > default to "http://cxf.apache.org/transports/http" and set to
> > "http://cxf.apache.org/transports/local" for tests.
> >
> > I've update the wiki to show how to create the clients in the latter case:
> > https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing
> > (see at the end)
> >
> > HTH, Sergey
> >
> >

Re: LocalTransport for integration testing

Posted by Mandy Warren <ma...@gmail.com>.
Just adding a few more comments as we have exactly this setup with our projects. We're using Maven and have a spring file (main-applicationContext.xml)under src/main/resources defining the jaxrs bean with the property placeholder as Sergey has
specified. This references a properties file with the actual address defined.

We've then got another Spring file (IntegrationTestsAppContext.xml) under src/integrationtest/resources which also has a property placeholder, pointing to another properties file with the local: address specified. This Spring file imports the main
Spring file (so we get all the jaxrs bean detail):

   <import
       resource="classpath:conf/spring/main-applicationContext.xml" />

and specifies this bean to enable local transport (we don't want this for live hence defining it in the integration test spring config).

       <bean class="org.apache.cxf.transport.local.LocalTransportFactory"
           lazy-init="false">
           <property name="transportIds">
               <list>
                   <value>http://cxf.apache.org/transports/local</value>
               </list>
           </property>
       </bean>

We then run our tests as follows:-

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:conf/spring/IntegrationTestsAppContext.xml" })
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class MyIntegrationTests {
   // Must match the overridden local endpoint.address
   private final static String ENDPOINT_ADDRESS = "local://abcd";

   @Test
   public void testStuff() throwsException {
   WebClient client = WebClient.create(ENDPOINT_ADDRESS);
       WebClient.getConfig(client).getRequestContext()
               .put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);

       Response response = client
               .path("v1/some/path/to/your/service")
               .type(MediaType.APPLICATION_XML)
               .accept(MediaType.APPLICATION_XML)
               .matrix("date", "2013-11-30")
               .get(Response.class);

   // do some asserts on the response

}

CXF makes it very nice and easy!

Hope this helps

Mandy

Sent from a mobile device

> On 28 Nov 2013, at 10:59, Sergey Beryozkin <sb...@gmail.com> wrote:
> 
> Hi
>> On 27/11/13 18:22, David Karlsen wrote:
>> Hi.
>> 
>> I´ve looked at
>> https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing#JAXRSTesting-LocalTransportfor
>> information on howto test JAX-RS services.
>> 
>> I´d like the LocalTransport approach (so I don´t have to configure TCP
>> ports etc), but I´d like to use springs test support (@ContextConfiguration
>> etc) and only add the LocalTransport configuration.
>> 
>> I´d also like to reuse the spring context file as it will look when
>> using/packaging it into a .war, which looks like:
>> 
>>   <jaxrs:server address="/v1">
>>         <jaxrs:serviceBeans>
>>             <ref bean="trackService" />
>>             <ref bean="blobService" />
>>         </jaxrs:serviceBeans>
>>         <jaxrs:providers>
>>             <bean
>> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
>>             <ref bean="serviceExceptionMapper" />
>>         </jaxrs:providers>
>>         <jaxrs:properties>
>>             <entry key="mtom-enabled" value="true" />
>>         </jaxrs:properties>
>>     </jaxrs:server>
>> 
>> Is it possible to configure only the LocalTransport stuff in my test, and
>> inject the configured Server from the context file with spring?
> The initialized server in this case will already HTTP Destination attached to it by default, so you can try to parameterize either the address or transportId attribute, for example, you'd have either
> 
> <jaxrs:server address="${prefix}/v1">
> 
> and default to "" and set to "local://" for tests
> 
> or
> 
> <jaxrs:server address="/v1" transportId=${transportId}>
> 
> default to "http://cxf.apache.org/transports/http" and set to
> "http://cxf.apache.org/transports/local" for tests.
> 
> I've update the wiki to show how to create the clients in the latter case:
> https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing
> (see at the end)
> 
> HTH, Sergey
> 
> 

Re: LocalTransport for integration testing

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
On 27/11/13 18:22, David Karlsen wrote:
> Hi.
>
> I´ve looked at
> https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing#JAXRSTesting-LocalTransportfor
> information on howto test JAX-RS services.
>
> I´d like the LocalTransport approach (so I don´t have to configure TCP
> ports etc), but I´d like to use springs test support (@ContextConfiguration
> etc) and only add the LocalTransport configuration.
>
> I´d also like to reuse the spring context file as it will look when
> using/packaging it into a .war, which looks like:
>
>    <jaxrs:server address="/v1">
>          <jaxrs:serviceBeans>
>              <ref bean="trackService" />
>              <ref bean="blobService" />
>          </jaxrs:serviceBeans>
>          <jaxrs:providers>
>              <bean
> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
>              <ref bean="serviceExceptionMapper" />
>          </jaxrs:providers>
>          <jaxrs:properties>
>              <entry key="mtom-enabled" value="true" />
>          </jaxrs:properties>
>      </jaxrs:server>
>
> Is it possible to configure only the LocalTransport stuff in my test, and
> inject the configured Server from the context file with spring?
>
The initialized server in this case will already HTTP Destination 
attached to it by default, so you can try to parameterize either the 
address or transportId attribute, for example, you'd have either

<jaxrs:server address="${prefix}/v1">

and default to "" and set to "local://" for tests

or

<jaxrs:server address="/v1" transportId=${transportId}>

default to "http://cxf.apache.org/transports/http" and set to
"http://cxf.apache.org/transports/local" for tests.

I've update the wiki to show how to create the clients in the latter case:
https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing
(see at the end)

HTH, Sergey