2010-04-20 122 views
15

我想單元測試一個用Apache CXF編寫的RESTful接口。如何注入Spring的JUnit測試ServletContext?

我用一個ServletContext加載一些資源,所以我有:

@Context 
private ServletContext servletContext; 

如果我這個部署在Glassfish,ServletContext的注入和它的作品像預期。但是我不知道如何在我的服務類中注入ServletContext,以便我可以使用JUnit測試來測試它。

我使用Spring 3.0,JUnit 4,CXF 2.2.3和Maven。

+0

見http://stackoverflow.com/questions/2665773/spring-i-wish-to-create-a-junit-test-for-a-web-application-webapplicationconte – lexicore 2010-04-20 12:31:32

回答

21

在你的單元測試中,你可能要創建一個MockServletContext的實例。

然後,您可以通過setter方法將此實例傳遞給您的服務對象。

1

也許你想閱讀與servletContext.getResourceAsStream或類似的東西的資源,爲了這個,我已經使用的Mockito這樣的:

@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

在Spring 4,對單元測試類@WebAppConfiguration註釋應該是足夠了,看到Spring reference documentation

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