我有 Spring MVC 应用程序 (4.2.1),其 Controller 需要“ADMIN”权限。我正在尝试测试普通用户得到“403”,管理员得到“200”。它在浏览器中工作,但在我的单元测试中,两个测试都失败并返回“302”状态。
我相信我已经按照书本设置了所有内容以使用@WithMockUser
。我想知道如何弄清楚为什么我会获得 302 状态。我怀疑它重定向到登录页面,因为它根本没有显示用户已登录,但我如何验证这一点?
@Test
@WithMockUser(roles={"USER","ADMIN"})
public void requestProtectedUrlWithAdminRole() throws Exception {
mvc.perform(get("/admin/").with(csrf()))
.andExpect(status().isOk())
.andExpect(content().string(containsString("Admin")))
.andReturn();
}
更新:
我发现可以通过在 perform
方法调用和第一个 .andExpect< 之间添加
..andDo(print())
来打印请求和响应
最佳答案
(添加我的评论作为答案)我认为您缺少监听器,这就是未使用注释的原因。将以下注释添加到您的测试类
@TestExecutionListeners( { WithSecurityContextTestExecutionListener.class })
您可能需要其他监听器来实现其他功能,但您绝对需要该监听器才能使注释 @WithMockUser
正常工作。
调试部分很棘手...您可以开始在 DispatcherServlet 上或在检查用户的过滤器中放置一些断点(很抱歉,但我不知道哪个类进行身份验证/授权)。
关于java - 如何在 Spring Controller 中模拟用户,并在某些内容丢失或未模拟时进行调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34955223/