> -----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.