Я использую PowerMockRunner
в приложении для весенней загрузки для тестирования.Все работает, но когда мои определения действий контроллеров содержат someControllerMethod(..., Authentication auth, ...)
.Тогда auth
равно нулю, и, следовательно, некоторый код не работает.
Я пытался высмеивать 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(...);
}
...
}