gpt4 book ai didi

spring - 如何与 HtmlUnit 共享 MockMvc session ?

转载 作者:行者123 更新时间:2023-12-02 00:57:30 28 4
gpt4 key购买 nike

我正在使用 Spring Test MVC HtmlUnit使用 Geb 来驱动我的 Spring MVC 应用程序的功能测试。我想检查一些 session 变量在交互过程中是否正确保存。我尝试创建一个测试 Controller 来返回这些变量,但 HtmlUnit 和 mvc.perform() 使用不同的 session 。有没有办法在它们之间使用单个共享 session ?

驱动设置:

MockMvc mvc = MockMvcBuilders.webAppContextSetup(ctx)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build()

HtmlUnitDriver driver = MockMvcHtmlUnitDriverBuilder.mockMvcSetup(mvc).javascriptEnabled(true).build()

测试:

when:
via ProtectedPage

then:
// this uses session A
at LoginPage

and:
// this uses session B
println mvc.perform(get('/test/sessionAttributes')).andReturn().response.contentAsString

最佳答案

总结

请问您为什么要尝试在 MockMvc 中完成一些工作,而在 HtmlUnit 中完成一些工作?它确实不是为以这种方式使用而设计的。相反,我建议与 HtmlUnit 交互以使用 session (就像您的浏览器一样)并验证这些结果。

这不起作用的原因是 MockMvc.perform 独立工作。 HtmlUnit 集成桥接了 MockMvc.perform 调用,以确保它们按照您在浏览器中的预期方式工作(即跟踪 session )。但是,桥接 MockMvc.perform 调用的逻辑被封装了。

MockMvc 行为

MockMvc 请求独立工作,默认情况下对每个请求使用一个新 session 。例如,以下两个请求在不同的 session 上运行:

// this uses session A
mvc.perform(get("/test"))

// this uses session B
mvc.perform(get("/test"))

为了重用 session ,您必须从第一次 MockMvc.perform 调用中获取 session ,并在第二次 MockMvc.perform 调用中设置它。例如:

MvcResult mvcResult = mvc
.perform(get("/a"))
.andReturn();

// reuse the previous session
MockHttpSession session = (MockHttpSession) mvcResult
.getRequest().getSession();
mvc.perform(get("/b").session(session));

HtmlUnit 支持跟踪 MockMvcWebConnection 中的 session 并根据 JSESSIONID cookie 设置适当的 session (类似于您在上面看到的)。

为了在 MockMvc 请求中重用来自 HtmlUnit 支持的 HttpSession,您需要访问原始 session 。但是,此逻辑封装在 HtmlUnit 支持中,因此您无法访问它。

解决方法

我不希望我们公开 HtmlUnit 集成的内部结构。我也不建议将 MockMvc HtmlUnit 集成与直接使用 MockMvc 混合和匹配。但是,您可以解决此问题。

第一步是创建一个跟踪上次 session 的 ResultHandler

public class SessionTracking implements ResultHandler {
private MockHttpSession lastSession;

@Override
public void handle(MvcResult result) throws Exception {
lastSession = (MockHttpSession) result.getRequest().getSession(false);
}

public MockHttpSession getLastSession() {
return lastSession;
}
}

下一步是确保您使用 MockMvc 实例注册 SessionTracking

SessionTracking sessions = new SessionTracking();

MockMvc mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(SecurityMockMvcConfigurers.springSecurity())
// ADD THIS
.alwaysDo(sessions)
.build();

HtmlUnitDriver driver = MockMvcHtmlUnitDriverBuilder
.mockMvcSetup(mvc)
.build();

现在,如果您需要发出 MockMvc 请求,您可以使用 SessionTracking 对象访问之前的 session 。

when:
via ProtectedPage

then:
// this uses session A
at LoginPage

and:
// this uses session A
println mvc.perform(get('/test/sessionAttributes').session(sessions.lastSession).andReturn().response.contentAsString

关于spring - 如何与 HtmlUnit 共享 MockMvc session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32897406/

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