Установить аутентификацию для интеграционного теста защищенного контроллера - PullRequest
1 голос
/ 07 февраля 2020

Я не могу установить аутентификацию для моего интеграционного теста контроллера покоя. Метод контроллера выглядит следующим образом:

@RestController
@RequestMapping(BASE_URL)
@RequiredArgsConstructor
public class EventController {

    public static final String BASE_URL = "/api/event";

    @PostMapping
    @PreAuthorize("hasRole('USER')")
    public void createEvent() {
        System.out.println("I am in controller");
    }
}

и вот мой тест:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class EventControllerTest {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @BeforeEach
    public void setup() {
        mockMvc = MockMvcBuilders
            .webAppContextSetup(context)
            .apply(springSecurity())
            .build();
    }

    @Test
    void create() throws Exception {
        this.mockMvc.perform(post(EventController.BASE_URL)
            .with(authentication(new UsernamePasswordAuthenticationToken(
                new MyPrincipal(100, "denis"),
                null,
                Collections.singletonList(new SimpleGrantedAuthority("USER"))
            )))
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().contentType("application/json"));
    }

Мой тест всегда не удался из-за статуса 401, поэтому моя поддельная аутентификация не работает. Можете ли вы сказать мне, как это исправить? Спасибо за совет.

1 Ответ

0 голосов
/ 07 февраля 2020

Самый простой способ проверить защищенные запросы - это использовать @WithMockUser(A_ROLE)

, чтобы ваш тест выглядел как

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@SpringBootTest
@AutoConfigureMockMvc
class EventControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    @WithMockUser("USER")
    void create() throws Exception {
        this.mockMvc.perform(post(EventController.BASE_URL)
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().contentType("application/json"));
    }
}

Некоторые замечания:

  • ваш тест ожидает результата, поэтому перенесите ваш контроллер или тест
    @PostMapping
    @PreAuthorize("hasRole('ROLE_USER')")
    public ResponseEntity<String> createEvent() {
        String result = "I am in controller";
        System.out.println(result);
        return ResponseEntity.ok().body(result);
    }

вы выполняете / тестируете POST, поэтому убедитесь, что в вашей конфигурации безопасности вы делаете http.csrf().disable()....

или укажите в тесте csrf-токен

 this.mockMvc.perform(post(EventController.BASE_URL)
         .with(SecurityMockMvcRequestPostProcessors.csrf()) // provide a csrf-token
         ....

'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...