使用MockMVC模拟SpringContextHolder

时间:2016-09-07 12:12:55

标签: java spring spring-mvc junit mockmvc

我正在为Controller层编写单元测试用例。我有一个调用,我从Spring SecurityContextHolder获取用户。当我运行我的测试用例时,我得到Null指针异常,因为我不知道如何模拟Spring安全上下文。

以下是我的代码,有任何建议怎么做?

Controller Methhod:

@RequestMapping(method = RequestMethod.POST)
public void saveSettings(@RequestBody EmailSettingDTO emailSetting) {
    User user = ((CurrentUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUser();
    settings.saveUserEmailSetting(user, emailSetting);

}

我的测试案例:

@Test  public void testSaveSettings() throws Exception {
mockMvc.perform(post(BASE_URL).content(this.objectMapper.writeValueAsString(emailDto))
  .contentType(MediaTypes.HAL_JSON)).andExpect(status().isOk());

}

2 个答案:

答案 0 :(得分:0)

为此目的有一个Spring Security Test库。

您可以使用"domain\alias"来实现此目的。请参阅post

答案 1 :(得分:0)

您可以使用@WithUserDetails

  

可以将此注释添加到测试方法中,以模拟使用UserDetailsS​​ervice返回的UserDetails运行。

通过使用它,您可以创建一个上下文来运行测试,例如:

@Test
@WithUserDetails("admin")
public void testAdmin() throws Exception {
    mockMvc.perform(...);
}

这将使用testAdmin() admin。

执行SecurityContext

但请注意,为了使用它;必须有一个名为User的{​​{1}}保留,否则您将获得结果例外。