I would suggest having a look at the Unit tests that come with CXF, they seem to have a simpler way of doing this.
Regards Kiren On Wed, Feb 1, 2012 at 10:21 PM, KARR, DAVID <[email protected]> wrote: > > -----Original Message----- > > From: cganesan [mailto:[email protected]] > > Sent: Wednesday, February 01, 2012 11:42 AM > > To: [email protected] > > Subject: Unit testing JAX-RS services > > > > Hi > > > > Is there a way to invoke the URLs for a JAX-RS end point services as > > part of > > JUnit test - triggered from MAven build? Does Apache CXF support > > something > > like an embedded container towards this? > > Yes. The core of this support is the > "org.apache.cxf.jaxrs.JAXRSServerFactoryBean" class. It internally manages > an embedded Jetty server that your service is automatically deployed to. > You can then use the "WebClient" class to connect to the server and get a > response. > > You'll probably find more history on this topic by searching the mailing > list (some of it from me). > > What's somewhat annoying is that you have to manually (as far as I can > tell) set the parameters for your JAX-RS server (which that class is > defining), instead of just using the settings from the Spring context. > I've defined a "ServerFactory" class with a "create()" method that sets > the properties that I need. I'll show that method here, but note that I'm > only setting properties that my app uses. You may have other needs. > > public static void create(Object serviceBean, JSONProvider > jsonProvider, String uri) { > JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); > > BindingFactoryManager manager = > sf.getBus().getExtension(BindingFactoryManager.class); > JAXRSBindingFactory factory = new JAXRSBindingFactory(); > factory.setBus(sf.getBus()); > > manager.registerBindingFactory(JAXRSBindingFactory.JAXRS_BINDING_ID, > factory); > > if (jsonProvider == null) { > Map<String, String> namespaceMap = new HashMap<String, > String>(); > XmlSchema xmlSchemaAnnotation = > ServiceCallResults.class.getPackage().getAnnotation(XmlSchema.class); > namespaceMap.put(xmlSchemaAnnotation.namespace(), "cns"); > jsonProvider = new JSONProvider(); > jsonProvider.setNamespaceMap(namespaceMap); > jsonProvider.setIgnoreNamespaces(false); > } > > sf.setProvider(jsonProvider); > > setJSONProvider(jsonProvider); > > Map<Object, Object> extensionsMap = new HashMap<Object, Object>(); > extensionsMap.put("json", "application/json"); > extensionsMap.put("xml", "application/xml"); > > sf.setExtensionMappings(extensionsMap); > > sf.setServiceBean(serviceBean); > sf.getInInterceptors().add(new LoggingInInterceptor()); > sf.getOutInterceptors().add(new LoggingOutInterceptor()); > > sf.setAddress(uri); > > sf.create(); > } > > Using this, I can write an integration test (I don't call this a unit > test) with a @BeforeClass method that initializes the server with my > service beans, and then my test methods just use WebClient. > >
