Тест контроллера не предоставляет никакого пути запроса к фильтру

#spring-boot

#spring-boot

Вопрос:

Я пишу тесты для своего контроллера. В моем приложении каждый запрос проходит через фильтр, но с исключением для некоторых запросов:

 @Component
//@Order(Ordered.LOWEST_PRECEDENCE-10)
public class FilterTokenValidator extends OncePerRequestFilter {

    ...

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        String path = request.getServletPath();
        return path.startsWith("/signup") || path.startsWith("/signin");
    }

    ...

}
 

В стандартно запущенном приложении все работает отлично, но когда я запускаю тесты…

 @RunWith(SpringRunner.class)
@WebMvcTest(controllers = ControllerSign.class)
@ContextConfiguration(classes= ToucanApplication.class)
@AutoConfigureMockMvc
public class ControllerSignTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @MockBean
    private ServiceSign serviceSign;

    @Autowired
    private ApplicationContext applicationContext;

    @MockBean
    private RepositoryNote repositoryNote;

    @MockBean
    private RepositoryUser repositoryUser;

    @BeforeEach
    void printApplicationContext() {
        Arrays.stream(applicationContext.getBeanDefinitionNames())
                .map(name -> applicationContext.getBean(name).getClass().getName())
                .sorted()
                .forEach(System.out::println);
    }

    @Test
    public void createUser_valuesOK_statusOK() throws Exception {
        //todo check out possibility of create object and call method in same expression
        JwtUtil jwtUtil = new JwtUtil();

        when(serviceSign.createUser(eq("user1"), eq("user1")))
                .thenReturn(jwtUtil.generateToken(new EntityUser("user1", "user1")));

        mockMvc.perform(
                post("/signup")
                        .contentType("application/json")
                        .content(objectMapper.writeValueAsString(new DtoUsernamePassword("user1", "user1")))
        ).andExpect(status().isOk());
    }


}
 

…filter не получает никакого пути (например, используя request.getServletPath() в методе doFilterInternal()), и все неправильно. Есть ли лучший способ сделать что-то вроде исключений в filter? Есть ли какая-то ошибка в моем тесте контроллера? Большое спасибо.

Комментарии:

1. Вам нужен путь n к пути сервлета. Используйте getRequestUri вместо getServletPath .

2. Спасибо. Тест пройден. Это была следующая небольшая ошибка, такая как неправильный импорт…