PowerMock: ложная аутентификация - PullRequest
0 голосов
/ 03 января 2019

Я использую 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(...);
    }
    ...
}
...