gpt4 book ai didi

java - 具有 session 支持的 Spring mvc 3.1 集成测试

转载 作者:IT老高 更新时间:2023-10-28 13:51:18 27 4
gpt4 key购买 nike

我正在使用新的 spring-test在 3.1 版本中运行集成测试。它工作得很好,但我无法让 session 正常工作。我的代码:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("src/main/webapp")
@ContextConfiguration({"classpath:applicationContext-dataSource.xml",
"classpath:applicationContext.xml",
"classpath:applicationContext-security-roles.xml",
"classpath:applicationContext-security-web.xml",
"classpath:applicationContext-web.xml"})
public class SpringTestBase {

@Autowired
private WebApplicationContext wac;
@Autowired
private FilterChainProxy springSecurityFilterChain;
@Autowired
private SessionFactory sessionFactory;

protected MockMvc mock;
protected MockHttpSession mockSession;

@Before
public void setUp() throws Exception {
initDataSources("dataSource.properties");

mock = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build();
mockSession = new MockHttpSession(wac.getServletContext(), UUID.randomUUID().toString());
}

@Test
public void testLogin() throws Exception {
// this controller sets a variable in the session
mock.perform(get("/")
.session(mockSession))
.andExpect(model().attributeExists("csrf"));

// I set another variable here just to be sure
mockSession.setAttribute(CSRFHandlerInterceptor.CSRF, csrf);

// this call returns 403 instead of 200 because the session is empty...
mock.perform(post("/setup/language")
.session(mockSession)
.param(CSRFHandlerInterceptor.CSRF, csrf)
.param("language", "de"))
.andExpect(status().isOk());
}
}

我的 session 在每个请求中都是空的,我不知道为什么。

编辑:最后一个断言失败:andExpect(status().isOk());。它返回 403 而不是 200。

最佳答案

更新答案:

似乎在构建器中添加了一个新方法“sessionAttrs”(参见 mvc controller test with session attribute)

Map<String, Object> sessionAttrs = new HashMap<>();
sessionAttrs.put("sessionAttrName", "sessionAttrValue");

mockMvc.perform(MockMvcRequestBuilders.get("/uri").sessionAttrs(sessionAttrs))
.andDo(print())
.andExpect(MockMvcResultMatchers.status().isOk());

旧答案:

这是一个更简单的解决方案,可以在不使用支持类的情况下达到相同的结果,这是我的代码片段(我不知道当 Biju Kunjummen 回答时这些方法是否已经可用):


HttpSession session = mockMvc.perform(post("/login-process").param("j_username", "user1").param("j_password", "user1"))
.andExpect(status().is(HttpStatus.FOUND.value()))
.andExpect(redirectedUrl("/"))
.andReturn()
.getRequest()
.getSession();

Assert.assertNotNull(session);

mockMvc.perform(get("/").session((MockHttpSession)session).locale(Locale.ENGLISH))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("logged_in"));

关于java - 具有 session 支持的 Spring mvc 3.1 集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13687055/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com