如何用应用程序上下文配置文件替换web.xml?

时间:2014-05-14 18:02:33

标签: java spring-mvc tomcat7 integration-testing web.xml

背景

我试图在Spring中实现控制器的集成测试。我 DON' 想要使用WebApplicationInitializer(Spring的Java配置)来运行我的网络应用。我想使用基于xml的配置。但是,@ContextConfiguration无法加载web.xml,因此我创建了application-context.xml。问题是web.xmlapplication-context.xml用于同一目的,

问题

我可以删除web.xml以支持application-context.xml吗?如果删除web.xml,测试将通过,但Web应用程序不会在Tomcat中运行。

这是我的测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:path/to/application-context.xml"})
@WebAppConfiguration
public class HelloControllerIntegrationTest {

    @Autowired
    private WebApplicationContext context;

    private WebClient webClient;

    @Before
    public void setup() throws Exception {
        MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build();

        webClient = new WebClient();
        webClient.setWebConnection(new MockMvcWebConnection(mockMvc));
    }

    @Test
    public void testPrintWelcome() throws Exception {
        // I'm trying to print out the page for now
        UnexpectedPage welcomePage = webClient.getPage("http://localhost/");
        InputStream is = welcomePage.getInputStream();
        java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
        String a = s.hasNext() ? s.next() : "";
        System.out.println(a);
    }
}

这是我的application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-3.2.xsd">

    <mvc:annotation-driven/>

    <mvc:default-servlet-handler/>

    <context:component-scan base-package="com.company.controller"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    </bean>
</beans>

1 个答案:

答案 0 :(得分:2)

您需要了解的是web.xmlapplication-context.xml有两个完全不同的目的。

第一个用于配置应用程序在servlet容器中运行,而第二个用于提供Spring配置。当容器支持servlet规范3.0或更高版本时,web.xml当然可以被基于Java的配置替换。

当运行Spring MVC测试以测试Spring控制器时,根本不使用web.xml,因为测试不在servlet容器中运行,因为测试框架模拟了所有依赖项。对于通过的代码,您可以很容易地进行Spring MVC测试,但如果您处于TDD环境中,则根本没有web.xml

总之,web.xmlapplication-context.xml所关注的问题是正交的,可以在不关心对方的情况下使用。

另外需要澄清的是,web.xml

中无法提供WebApplicationInitializerapplication-context.xml替代方案提供的配置