Spring Security и MockMvc - нужно издеваться над аутентификацией или принципалом - PullRequest
0 голосов
/ 14 марта 2019

Я использую Spring Security и сталкиваюсь с проблемой написания модульного тестового примера (использующего MockMvc) для контроллера.

У меня есть метод в моем контроллере, который выглядит примерно так:

@GetMapping
public ResponseEntity<User> getUser(@AuthenticationPrincipal User activeUser){
    String userEmail = activeUser.getEmail();
    return userService.getUser(userEmail);
}

Я получаю ошибку 500 с этим.

Еще один вариант для контроллера, который я пробовал, - это работает на Postman / Curl:

@GetMapping
public ResponseEntity<User> getUser(OAuth2Authentication authentication){
    String userEmail = (String) authentication.getUserAuthentication().getPrincipal();
    return userService.getUser(userEmail);
}

Мой сервис выглядит так:

public ResponseEntity<User> getUser(String email) {
    return userRepository.findByEmail(email)
            .map(record -> ResponseEntity.ok().body(record))
            .orElse(ResponseEntity.notFound().build());
}

В моем модульном тесте для этого метода контроллера у меня есть:

@Test
@WithMockUser(username = "1", password = "pwd", roles = "USER")
public void controller_should_get_user() throws Exception {
    when(userService.getUser("1")).thenReturn(new ResponseEntity(userMock, HttpStatus.OK));
    this.mockMvc.perform(MockMvcRequestBuilders.get("/api/user/")).andExpect(status().isOk());
}

Я получаю следующую ошибку:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
at com.timecloud.user.controller.UserControllerTest.controller_should_get_user(UserControllerTest.java:60)

Как следуетЯ прохожу прохождение или издевательство над пользователем с текущей аутентификацией?Благодаря.

1 Ответ

0 голосов
/ 14 марта 2019

NullPointerException идет, потому что ваш тест не может найти ничего для OAuth2Authentication объекта.В тестовом примере вы можете выполнить две вещи:

  1. Попробуйте использовать Mocking OAuth2Authentication в некотором методе setUp.

ИЛИ

Если вы используете Spring 4.0+, лучшим решением будет аннотировать метод теста с помощью @ WithMockUser

@Test @WithMockUser(username = "user1", password = "pwd", roles = "USER") public void mytest1() throws Exception { //Your test scenario }

...