2011-10-09 17 views
5

Tengo un recurso de Jersey que deseo probar con JUnit. El recurso utiliza proveedores Guice para inyectar ciertos campos:Pruebas unitarias Recursos de Jersey con campos inyectados de Guice

@Path("/example/") 
class ExampleResource { 
    @Inject 
    Provider<ExampleActionHandler> getMyExampleActionHandlerProvider; 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<ExamplePojo> getExampleList() { 
     ExampleActionHandler handler = getMyExampleActionHandlerProvider.get(); 
     handler.doSomething(); 
    ... 

Todo esto funciona muy bien cuando se utiliza un servidor real al servicio de la API, sin embargo probando es problemático.

Mi clase de pruebas que actualmente se ve algo como:

public class ApiTest extends JerseyTest { 

    public ApiTest() throws Exception { 
    super(); 
    ApplicationDescriptor appDescriptor = new ApplicationDescriptor(); 
    appDescriptor.setContextPath("/api"); 
    appDescriptor.setRootResourcePackageName("com.my.package.name"); 
    super.setupTestEnvironment(appDescriptor); 
    } 

    @Test 
    public void testHelloWorld() throws Exception { 
    String responseMsg = webResource.path("example/").get(String.class); 
    Assert.assertEquals("{}", responseMsg); 
    } 
} 

Claramente, Guice no está recibiendo la oportunidad de inicializar los campos de ExampleResource para que la llamada handler.doSomething() no da lugar a una NullPointerException.

¿Hay alguna manera de decirle a Jersey que cree una instancia de la clase ExampleResource con Guice para que el proveedor funcione?

+1

Sé que esto es un poco tarde, pero por si acaso todavía estás viendo esto, lo que acabaste haciendo arriba? – talon8

+0

@minichate ¿conseguiste que esto funcionara? –

Respuesta

0

Una forma de hacerlo es dividir las pruebas en pocos pasos. Debe crear el inyector con el que está configurando el servicio y probar ese inyector (consulte Testing Guice Servlet bindings y Testing Guice can init servlets). Al usar estas pruebas, asegúrese de tener los enlaces correctos en su lugar. Una vez que tenga el inyector, obtener el objeto applicationDescriptor de ella con

ExampleResource exampleResource = injector.getInstance(ExampleResource.class); 
Assert.assertEquals(myList, getExampleList()); 
+0

El problema con este enfoque es que ninguno de los poderes mágicos que hace Jersey está disponible, como los campos anotados @DefaultValue(). De hecho, he tenido esto funcionando de la manera que quiero, simplemente tratando de envolverlo en algo que se pueda publicar en SO. – minichate

+0

¿Cómo hiciste que esto funcionara? – bobK