【问题标题】:Custom Spring Security Filter Test with MockMvc always returns 404使用 MockMvc 自定义 Spring 安全过滤器测试总是返回 404
【发布时间】:2019-06-26 17:18:46
【问题描述】:

我正在尝试使用 MockMvc 测试自定义过滤器,它始终返回状态 404 而不是从过滤器类返回的实际状态。 过滤器类如下所示:

    public class CustomFilter extends GenericFilterBean {

        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {

            HttpServletRequest request = (HttpServletRequest) servletRequest;
            // some logic 
            chain.doFilter(servletRequest, servletResponse);
        }
    }

这是使用FilterRegistrationBeanSpringBootApplication中注册的

    @SpringBootApplication
    public class MyApplication {

        public static void main(String[] args) {
           try {
              ConfigurableApplicationContext ctx = SpringApplication.run(MyApplication.class, args);
           } catch (Throwable e) {
        }

        @Bean
        public FilterRegistrationBean<CustomFilter> customFilter() {
           FilterRegistrationBean<CustomFilter> filterRegistration = new FilterRegistrationBean<>();
           filterRegistration.setFilter(new CustomFilter());
           filterRegistration.addUrlPatterns("/test/*");
           return filterRegistration;
        }
    }

对此的测试写如下:

    @RunWith(SpringRunner.class)
    @SpringBootTest(CustomFilter.class)
    @EnableAutoConfiguration 
    @WebAppConfiguration
    public class CustomFilterTest {

        @Autowired
        private CustomFilter filter;

        @Autowired
        private WebApplicationContext context;

        private MockMvc mvc;

        @Before
        public void setup() {
            this.mvc = MockMvcBuilders.webAppContextSetup(context)
                 .addFilters(filter)
                 .build();
        }

        @Test
        public void testCustomFilter() throws Throwable {

           MockHttpServletRequestBuilder request = MockMvcRequestBuilders
                .request(HttpMethod.POST, "/resource/abc")
                .header("SomeHeader", "xxx")
                .content("{}");

           MockHttpServletResponse response = mvc.perform(request).andReturn().getResponse();

           assertEquals(response.getStatus(), HttpServletResponse.SC_CONTINUE);
        }
    }

断言总是返回404的状态值。

我错过了什么吗?

【问题讨论】:

    标签: spring-boot spring-security mockmvc


    【解决方案1】:

    addFilter(filter, "/resource/abc")中添加urlPatterns,并为上面的代码sn-p添加一个测试控制器,如下:

    @RestController
    public class TestController {
    
        @PostMapping("/resource/abc")
        public void testSecureEndpoint() {
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-08
      • 2018-04-27
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 2018-06-11
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多