Контекст: я создал тестовую аннотацию @WithMockAuthentication
, чтобы заполнить тестовый контекст безопасности экземпляром Authentication
, очень похоже на @WithMockUser
. Основное различие заключается в том, что в моем случае этот экземпляр является макетом Mockito.
Что я испытываю: как только я заменяю фактический экземпляр на макет, экземпляр Authentication
, предоставленный в качестве параметра метода контроллера, имеет значение null в аннотированных тестах: в WithSecurityContextFactory
, если я заменю:
public Authentication workingAuthentication(WithMockAuthentication annotation) {
return new TestAuthentication(annotation.name(), Stream.of(annotation.authorities()).map(SimpleGrantedAuthority::new).collect(Collectors.toSet()));
}
на
public Authentication bogousAuthentication(WithMockAuthentication annotation) {
var auth = mock(Authentication.class);
when(auth.getName()).thenReturn(annotation.name());
when(auth.getAuthorities()).thenReturn((Collection) Stream.of(annotation.authorities()).map(SimpleGrantedAuthority::new).collect(Collectors.toSet()));
when(auth.isAuthenticated()).thenReturn(true);
return auth;
}
Тогда я получу NPE в тестах контроллера на
@RequestMapping("/method")
@PreAuthorize("hasRole('ROLE_AUTHORIZED')")
public ResponseEntity<String> securedMethod(Authentication auth) {
// Here, auth is null if Authentication is a mock
return ResponseEntity.ok(String.format("Hey %s, how are you?", auth.getName()));
}
Я создал минимальный образец для воспроизведения . Запустите тест, чтобы увидеть ошибку.
Я почти уверен, что столкнулся с ошибкой. Достаточно создать проблему в проекте обеспечения безопасности Spring , но кажется, что у команды команды Spring нет времени расследовать ...
[ПРАВИТЬ] Это последнее утверждение бесполезно оскорбительно и совершенно неверно как ответ предоставлен Робом Уинчем, который является одним из основных членов Spring-Security: / My Bad