vendredi 20 février 2015

How to in-memory unit test Spring-Jersey

I'm working with Spring-Jersey3 and cannot figure out how to unit test the RESTFul API with Spring beans


Controller



package com.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.service.DataSource;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("test")
@Component
public class SpringController {

@Autowired
private DataSource datasource;

@GET
@Produces(MediaType.TEXT_PLAIN)
public String getHello() {
return new String(datasource.load());
}
}


Service Interface



package com.service;

public interface DataSource {
public String load();
}


Service Implementation



package com.service;

import org.springframework.stereotype.Repository;

@Repository
public class DataSourceImpl implements DataSource {

@Override
public String load() {
return "Hello";
}
}


ResourceRegister.java (Jersey resource register)



package com.component;

import org.glassfish.jersey.server.ResourceConfig;
import com.controller.SpringController;

public class ResourceRegister extends ResourceConfig {

public ResourceRegister () {
register(SpringController.class);
}
}


web.xml



<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://ift.tt/ra1lAU" xmlns="http://ift.tt/nSRXKP" xsi:schemaLocation="http://ift.tt/nSRXKP http://ift.tt/1eWqHMP" version="3.0">

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>

<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.component.ResourceRegister</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>


serviceContext.xml (Application Context)



<?xml version="1.0" encoding="UTF-8"?>

<beans
xmlns="http://ift.tt/GArMu6"
xmlns:xsi="http://ift.tt/ra1lAU"
xmlns:context="http://ift.tt/GArMu7"
xsi:schemaLocation="http://ift.tt/GArMu6
http://ift.tt/1jdM0fG
http://ift.tt/GArMu7
http://ift.tt/1jdLYo7">

<context:component-scan base-package="com.service" />
<context:component-scan base-package="com.controller" />

</beans>


Unit test <<-- I really have no Idea how to test this



public class test extends JerseyTest{

public test(){
super("com.service", "com.controller");
}

@Override
protected AppDescriptor configure(){
return new WebAppDescriptor.Builder("com.service","com.controller")
.contextParam("contextConfigLocation", "classpath:serviceContext.xml")
.contextPath("/rest")
.servletClass("org.glassfish.jersey.servlet.ServletContainer.class")
.initParam("javax.ws.rs.Application", "com.component.ResourceRegister")
.build();
}

@Test
public void test(){
Client client = new Client();
WebResource resource = client.resource("test");

ClientResponse response = resource.post(ClientResponse.class);

assertEquals(200, resposne.getStatus());
}
}


Project Source Code


Problem : Dependency injection returns null


Aucun commentaire:

Enregistrer un commentaire