所以我们几乎达到了测试驱动我们的 spring web-mvc 应用程序的目标。我们正在使用 Spring Security 来保护 URL 或方法,并且我们希望使用 Spring-Web-Mvc 来测试控制器。问题是:Spring 安全性依赖于 web.xml 中定义的 FilterChain:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
虽然 spring-web-mvc 即使使用自定义上下文加载器也只能加载通常的应用程序上下文内容:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebContextLoader.class, locations = {
"file:src/main/webapp/WEB-INF/servlet-context.xml", "file:src/main/webapp/WEB-INF/dw-manager-context.xml" })
public class MvcTest {
@Inject
protected MockMvc mockMvc;
@Test
public void loginRequiredTest() throws Exception {
mockMvc.perform(get("/home")).andExpect(status().isOk()).andExpect(content().type("text/html;charset=ISO-8859-1"))
.andExpect(content().string(containsString("Please Login")));
}
}
如您所见,我们设置了我们的网络应用程序,以便在调用 /home 时会提示匿名用户登录。这与 web.xml 一起工作正常,但我们不知道如何将其集成到我们的测试中.
有什么方法可以向 spring-test-mvc 添加过滤器?
现在我想我可能必须从开始GenericWebContextLoader
,深入研究MockRequestDipatcher
哪些实现RequestDispatcher
,以某种方式添加一个过滤器,然后告诉GenericWebContextLoader
使用我的实现......但我对整个网络堆栈非常不熟悉,并且更喜欢一个更简单的解决方案,可以帮助我避免深入研究这些东西......
有什么想法/解决方案吗?
无论如何,我将如何手动添加过滤器?web.xml 不能是唯一这样做的地方......
谢谢!