Spring Boot OncePerRequestFilter shouldNotFilter Junit

Я пытаюсь добавить тестовый пример junit для моей логики метода Spring Boot OncePerRequestFilter shouldNotFilter. Логика отлично работает с вызовами REST в реальном времени, но случай junit не работает. Любая идея?.

Вот тестовый код.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SpringFilterTest {
    @Test
    public void getHealthTest() throws Exception {
        standaloneSetup(new PersonController()).addFilter(new SkipFilter()).build().perform(get("/health")).andExpect(status().isOk());
    }
    @Test
    public void getPersonTest() throws Exception {
        standaloneSetup(new PersonController()).addFilter(new SkipFilter()).build().perform(get("/person")).andExpect(status().isAccepted());
    }
    private class SkipFilter extends OncePerRequestFilter {

        private Set<String> skipUrls = new HashSet<>(Arrays.asList("/health"));
        private AntPathMatcher pathMatcher = new AntPathMatcher();

        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                                        FilterChain filterChain) throws ServletException, IOException {
            filterChain.doFilter(request, response);
            response.setStatus(HttpStatus.ACCEPTED.value());
        }

        @Override
        protected boolean shouldNotFilter(HttpServletRequest request) {
            return skipUrls.stream().anyMatch(p -> pathMatcher.match(p, request.getServletPath()));
        }
    }
    @RestController
    @RequestMapping(value = "/")
    private static class PersonController {

        @GetMapping("person")
        public void getPerson() {
        }

        @GetMapping("health")
        public void getHealth() {
        }
    }
}

Я ожидаю, что оба случая junit @Test будут успешными, но один из них всегда терпит неудачу (он использует фильтр).

В случае, если вы хотите реплицировать ниже, полный код репо. https://github.com/imran9m/spring-filter-test

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
4 084
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Выражение ниже оценивается как ложное с request.getServletPath(), когда /health

skipUrls.stream().anyMatch(p -> pathMatcher.match(p, request.getServletPath()));

Измените на request.getRequestURI(), чтобы получить uri, и условие ниже соответствует пути

 skipUrls.stream().anyMatch(p -> pathMatcher.match(p, request.getRequestURI())); 

Спасибо. После этого все заработало. Странно, что getServletPath не работает только с junit. Мне может не хватать инициализации, чтобы сделать getServletPath истинным.

Imran 20.10.2018 16:09

Другие вопросы по теме