2010-04-20 35 views
15

Quiero probar la unidad de una interfaz RESTful escrita con Apache CXF.Cómo inyectar ServletContext para pruebas JUnit con Spring?

Puedo usar un ServletContext cargar algunos recursos, por lo que tengo:

@Context 
private ServletContext servletContext; 

Si puedo implementar esto en Glassfish, se inyecta el ServletContext y funciona como se esperaba. Pero no sé cómo inyectar el ServletContext en mi clase de servicio, para poder probarlo con una prueba JUnit.

Uso Spring 3.0, JUnit 4, CXF 2.2.3 y Maven.

+0

ver http://stackoverflow.com/questions/2665773/spring-i-wish-to-create-a-junit-test-for-a-web-application-webapplicationconte – lexicore

Respuesta

21

En la prueba de unidad, es probable que desee crear una instancia de MockServletContext.

A continuación, puede pasar esta instancia a su objeto de servicio a través de un método setter.

1

Probablemente desea leer con recursos servletContext.getResourceAsStream o algo así, para este he utilizado Mockito así:

@BeforeClass 
void setupContext() { 

    ctx = mock(ServletContext.class); 
    when(ctx.getResourceAsStream(anyString())).thenAnswer(new Answer<InputStream>() { 
     String path = MyTestClass.class.getProtectionDomain().getCodeSource().getLocation().getPath() 
       + "../../src/main/webapp"; 

     @Override 
     public InputStream answer(InvocationOnMock invocation) throws Throwable { 
      Object[] args = invocation.getArguments(); 
      String relativePath = (String) args[0]; 
      InputStream is = new FileInputStream(path + relativePath); 
      return is; 
     } 
    }); 

} 
14

A partir de la primavera 4, anotación @WebAppConfiguration en la clase de prueba de unidad debe ser suficiente, ver Spring reference documentation

@ContextConfiguration 
@WebAppConfiguration 
public class WebAppTest { 
    @Test 
    public void testMe() {} 
} 
Cuestiones relacionadas