Spring MVC Test MockMvc - как настроить префикс отображения URL - PullRequest
0 голосов
/ 18 июня 2019

У меня есть DispatcherServlet, у которого есть сопоставление URL /api1 и, следовательно, контроллер с отображением @GetMapping("/resource1") для метода контроллера.Поэтому в основном у меня есть действительный URL /api1/resource1, который должен обрабатываться упомянутым контроллером.

Кроме того, в настройку включен Spring Security Filter, который сопоставляет запросы /*, так как он защищает другие URL, не обработанные Spring (но джерси например).API, защищенный Spring Security Filter, настроен следующим образом:

    protected void configure(HttpSecurity http) throws Exception {
        //@formatter:off
        http.sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
                .requestMatchers()
                .antMatchers("/api1/**")
            .and()
            .authorizeRequests()
                .antMatchers("/**")
                .authenticated()

. Для тестирования я использую поддержку MockMvc * для настройки виртуальной веб-среды, включая настройку безопасности Spring

mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build()

Я хочучтобы проверить, применяются ли проверки безопасности и вызывается ли метод контроллера при успешных проверках безопасности.

        when:
        def result = mvc.perform(
                get('/api1/resource1')
                    .header(HttpHeaders.AUTHORIZATION,  "Bearer " + apiToken))

        then:
          result.andExpect(status().isOk())

Приведенный выше код основан на платформе Spock с компонентом MockMvc.Все проверки безопасности проходят, поэтому настройка безопасности Spring завершена, но, наконец, контроллер должен быть вызван, но происходит сбой со статусом 404, т. Е. Ресурс - это метод сопоставленного контроллера - не найден.

IЯ уверен, что это не удастся, потому что макет установки не включает отображение сервлета диспетчера /api.Чтобы подтвердить это предположение, я могу изменить отображение метода контроллера на @GetMapping("/api1/resource1"), и в результате теста будет получен HTTP OK (200).

Итак, мой вопрос, можно ли настроить вид префикса URLв настройке MockMvc?Есть одно ограничение: база кода не использует Spring Boot (и не может некоторое время в будущем)!

Редактировать : я добавил следующее в свой тест, чтобы все запросыустановить servletPath.

    static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) {
        new MockHttpServletRequestBuilder(HttpMethod.GET, urlTemplate, uriVars)
                .servletPath('/api1')
    }

1 Ответ

1 голос
/ 20 июня 2019

Я думаю, вам просто нужно настроить contextPath для запроса.

Подробнее см. org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder.contextPath(String).

...