我正在Spring Boot应用程序中使用PowerMockRunner
进行测试。一切正常,但是当我的控制器动作定义包含someControllerMethod(..., Authentication auth, ...)
时。然后auth
为null,因此某些代码无法正常工作。
我尝试模拟Authentication
和SecurityContext
。出现了这样的情况
private void mockSecurity() {
Authentication authentication = mock(Authentication.class);
SecurityContext securityContext = mock(SecurityContext.class);
List<SimpleGrantedAuthority> authorities = Arrays.asList(new SimpleGrantedAuthority("USER"));
User mockedUser = new User("testuser", "passwordtest", authorities);
when(securityContext.getAuthentication()).thenReturn(authentication);
SecurityContextHolder.setContext(securityContext);
when(SecurityContextHolder.getContext().getAuthentication().getDetails()).thenReturn(mockedUser);
when(SecurityContextHolder.getContext().getAuthentication().getName()).thenReturn(mockedUser.getUsername());
}
现在,如果我的代码使用SecurityContextHolder.getContext().getAuthentication()
访问身份验证的方法,但那些自动注入的方法不起作用(可能是因为创建控制器模拟时尚未对它进行模拟),这些模拟就可以工作了。
有什么想法可以模拟注入的Authentication
,因此不需要更改代码吗? spring-security-test
和@MockWithUser
的结果相同。
测试的相关部分如下所示,
@RunWith(PowerMockRunner.class)
public class UserControllerTest {
@InjectMocks
UserController userController;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mockMvc = standaloneSetup(userController).build();
}
@Test
public void getUserDetails() {
mockSecurity();
mockMvc.perform(...).andExpect(...);
}
}
根据pvpkiran控制器代码的要求进行编辑
@RequestMapping(...)
public void getDetails(@PathVariable String id, Authentication auth) {
UserDetails loadedDetails = userService.getUserDetails(id);
if (!loadedDetails.getUserId().equals(auth.getName())) {
throw new Exception(...);
}
...
}