Spring mvc SpringMVC与SpringSecurity的集成测试
我正在尝试使用mvc测试来测试我的登录页面。 在我添加spring安全性之前,我工作得相当好 我的代码是:Spring mvc SpringMVC与SpringSecurity的集成测试,spring-mvc,spring-security,spring-test-mvc,Spring Mvc,Spring Security,Spring Test Mvc,我正在尝试使用mvc测试来测试我的登录页面。 在我添加spring安全性之前,我工作得相当好 我的代码是: mockMvc.perform( post("j_spring_security_check") .param(LOGIN_FORM_USERNAME_FIELD, testUsernameValue) .param(LOGIN_FORM_PASSWORD_FIELD, testPasswordVa
mockMvc.perform(
post("j_spring_security_check")
.param(LOGIN_FORM_USERNAME_FIELD, testUsernameValue)
.param(LOGIN_FORM_PASSWORD_FIELD, testPasswordValue))
.andDo(print())
.andExpect(status().isOk())
.andExpect(model().attribute(LOGIN_PAGE_STATUS_VALUE, LOGIN_PAGE_STATUS_FALSE_INDICATOR));
测试类添加了正确的注释:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })
我的筛选器已定义(在web.xml中):
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
当我尝试在@ContextConfiguration中添加web.xml时失败,当我删除它时,我得到一个异常:
java.lang.AssertionError: Status expected:<200> but was:<405>
java.lang.AssertionError:应为状态:但为:
有没有办法通过在my security-context.xml中定义的配置将DelegatingProxyFilter添加到测试上下文以使其工作?我尝试了一些关于注入FilterProxyChain的教程,但在我的案例中不起作用
有人能帮我吗?
提前感谢更新:Spring Security 4+提供了开箱即用的功能。要使用它,请确保使用
apply(springSecurity())
,如下所示:
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class MockMvcSecurityTests {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}
...
}
原始答案
我不确定您所说的“当我尝试在@ContextConfiguration中添加web.xml时失败了”是什么意思,但是,您可以使用SpringTestMVC来验证Spring安全性。有一个非常好的例子
基本大纲如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })
public class MyTests {
@Autowired
private FilterChainProxy springSecurityFilterChain;
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
.addFilters(this.springSecurityFilterChain).build();
}
}
其思想是,您可以@Autowire
使用FilterChainProxy
(DelegatingProxyFilter
委托的内容)并指示MockMvc
使用FilterChainProxy
注意spring test mvc集成到spring-test-3.2+和spring 3.1.x的一个单独项目中,因此您可以完全互换地使用该示例(spring test mvc不支持@WebAppConfiguration
,而必须使用WebContextLoader
。添加到pom.xml中
<repository>
<id>spring-snaspho</id>
<url>http://repo.springsource.org/libs-milestone/</url>
</repository>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<version>4.0.0.M1</version>
</dependency>
斯纳斯波温泉酒店
http://repo.springsource.org/libs-milestone/
org.springframework.security
()不要认为你可以用这种方式测试安全过滤器,因为它不是一个完整的http服务器,而是一种解决spring mvc测试提供的rls的方法。您可能只需要依靠单元测试来验证位中的各个部分。很棒的gihub链接!非常感谢。注意。用于弹簧安全性的弹簧启动机POM不包括弹簧安全性测试。我不得不将它添加到我的主POM中,以获取springSecurity()Boot使用spring security bom,其中包括4.1.0+中的spring security test@Rob我有spring Boot starter security、spring Boot starter test和spring security test(4.1.0.RELEASE)以及spring Boot 1.3.5。如果我删除了spring安全测试,那么它对我不起作用。对不起,我误解了。是的,您需要包括spring安全测试。但是,您不需要提供版本。
<repository>
<id>spring-snaspho</id>
<url>http://repo.springsource.org/libs-milestone/</url>
</repository>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<version>4.0.0.M1</version>
</dependency>