8

Ho letto i documenti (http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/testing.html#spring-mvc-test-framework) più volte e non posso confermare se il contesto WebApplicationContext che viene iniettato quando si utilizza l'annotazione @WebApplicationContext sta effettivamente guardando il web.xml.Il nuovo Spring MVC Test Framework rilasciato nella primavera 3.2 verifica la configurazione web.xml?

In altre parole, voglio testare la mia configurazione web.xml. I filtri e il percorso del servlet in particolare. Ma quando configuro il mio test ignora il web.xml. (Ad esempio, provo una richiesta get su un URL come questo /myServletPath/foo e viene a mancare con un 404.)

La mia prova:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration({ 
     "classpath*:WEB-INF/config/application-context.xml", 
     "classpath*:WEB-INF/oms-servlet.xml", 
     "classpath*:persistence-context.xml" 
}) 
public class OrderSummaryControllerIntegrationTests { 

    @Autowired 
    private WebApplicationContext wac; 

    private MockMvc mockMvc; 

    @Before 
    public void setUp() throws Exception { 
     this.mockMvc = webAppContextSetup(this.wac).build(); 
    } 

    @Test 
    public void testFindOrderSummariesExpectsSuccess() throws Exception { 
     mockMvc.perform(get("/oms/orders?user=1234&catalog=bcs")) 
       .andDo(print()) 
       .andExpect(status().isOk()) 
       .andExpect(content().contentType(MediaType.APPLICATION_JSON)); 
    } 
} 

E il mio web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     version="2.5"> 
    <display-name>OMS REST Services</display-name> 

    <servlet-mapping> 
     <servlet-name>default</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 

    <servlet-mapping> 
     <servlet-name>default</servlet-name> 
     <url-pattern>*.css</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>webappMetricsFilter</filter-name> 
     <filter-class>com.yammer.metrics.web.DefaultWebappMetricsFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>webappMetricsFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/config/application-context.xml, classpath*:persistence-context.xml</param-value> 
    </context-param> 

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

    <servlet> 
     <servlet-name>oms</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>oms</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

</web-app> 

risposta

8

hai ragione , Spring-mvc-test non legge il file web.xml, ma puoi configurare i filtri in questo modo:

webAppContextSetup(this.wac).addFilter(new DefaultWebappMetricsFilter(), "/*").build() 
+0

Grazie. Questo è utile. Non sono ancora sicuro del motivo per cui la creazione del mock richiede la posizione della root dell'applicazione web se non sta leggendo il web.xml. Vedi il mio commento sulla risposta di Ralph http://stackoverflow.com/a/14026570/411229. –

+1

perché utilizza altre risorse dalla radice dell'applicazione Web, ad es. se la configurazione della tua applicazione Web Spring è stata inserita in WEB-INF/spring/appcontext.xml, sebbene non sia nel classpath, potrebbe comunque essere accessibile e caricata nel test. –

+0

questo ha senso. La documentazione non è molto chiara su questo punto. Grazie per averlo chiarito. –