java - 如何使用 MockMvc 和 Mockito 测试无状态
问题描述
我最近继承了一些 java 代码,需要在 HttpSecurity 配置中切换到无状态:
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
之后,一些使用 MockMvc 的测试失败了。我知道@WithMockUser 不适用于无状态,那么我应该改变什么才能让它通过?这是一个示例测试:
@Before
public void setUp() throws Exception {
this.mockMvc = MockMvcBuilders.standaloneSetup(apAdminController)
.apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
.setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver())
.build();
storeUser = new StoreUser();
storeUser.setUsername("smith");
storeUser.setEnabled(true);
}
@Test
@WithMockUser(roles = "ADMIN")
public void testViewStoreUserWithAdmin() {
try {
mockMvc.perform(
get("{resource}/1", RESOURCE).with(testSecurityContext()))
.andDo(print())
.andExpect(status().isOk());
} catch (Exception e) {
fail("Test failed: " + e.getMessage());
}
}
解决方案
我花了很长时间才找到答案,这就是我最终得到的结果,以防万一有人在苦苦挣扎:
在测试中将 SessionCreationPolicy 从“If_REQUIRED”或“ALWAYS”更改为“STATELESS”后:将导入替换.SecurityMockMvcRequestPostProcessors.testSecurityContext;
为导入.SecurityMockMvcRequestPostProcessors.user;
并在设置中使用它:
this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilters(springSecurityFilterChain)
.build();
删除所有注释@WithMockUser
,最后更改
get("{resource}", RESOURCE).with(testSecurityContext()))
至 get("{resource}", RESOURCE).with(user("admin").roles("ADMIN")))
推荐阅读
- android - 当密码和确认密码输入错误时,错误响应 500 未显示
- web-scraping - 使用 ImportHTML 或 ImportXML 在 Google 表格中选择不连续的列、删除行和添加排序列
- php - 如何检查我的应用程序需要哪些 PHP 扩展才能工作?
- express - 获取 POST 请求待处理(从注册表单发送数据)
- c# - 收到一条错误消息,说明 StringContent 中缺少参数,但它存在?
- javascript - 递归地跟踪具有最终值的嵌套对象键
- typescript - 扩展接口以包含日期类型
- android - Andorid中的图像数据解密错误
- spring - 在我的 Spring Boot 项目中保护 REST API 的 spring 安全实现
- python - 用loc计算timedelta?