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>
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. –
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. –
questo ha senso. La documentazione non è molto chiara su questo punto. Grazie per averlo chiarito. –