【问题标题】:How should I test Servlet Filters?我应该如何测试 Servlet 过滤器?
【发布时间】:2015-08-05 04:00:02
【问题描述】:

无法弄清楚如何测试我的 servlet 过滤器

@Component
@Order( Ordered.HIGHEST_PRECEDENCE )
class CORSFilter extends OncePerRequestFilter {
    private final Logger log = LoggerFactory.getLogger( CORSFilter.class );

    @Override
    protected void doFilterInternal(
            final HttpServletRequest request,
            final HttpServletResponse response,
            final FilterChain filterChain )
            throws ServletException, IOException {
        log.debug( "request: {}", request );
        response.setHeader( "Access-Control-Allow-Origin", "*" );
        response.setHeader( "Access-Control-Allow-", "POST, GET, PUT, OPTIONS, DELETE" );
        response.setHeader( "Access-Control-Allow-Headers", "content-type, x-auth-token, x-requested-with" );
        response.setHeader( "Access-Control-Expose-Headers", "Location" );
        response.setIntHeader( "Access-Control-Max-Age", 3600 );
        filterChain.doFilter( request, response );
    }
}

这是我尝试编写测试的方法

@RunWith( SpringJUnit4ClassRunner.class )
@WebAppConfiguration
@ComponentScan( "com.xenoterracide.rpf.infrastructure.http")
@SpringApplicationConfiguration( classes = { MockServletContext.class } )
public class TestHeaders {

    @Autowired
    private WebApplicationContext context;
    private MockMvc               mockMvc;

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

    @Test
    public void testCORS() throws Exception {
        this.mockMvc.perform( options( "/" ) )
                    .andExpect( status().is2xxSuccessful() )
                    .andExpect( header().string( "Access-Control-Allow-Origin",
                            allOf( notNullValue(), instanceOf( String.class ) ) ) );
    }

}

这是我的测试错误

java.lang.AssertionError: Response header Access-Control-Allow-Origin
Expected: (not null and an instance of java.lang.String)
 but: not null was null

如何测试我的 servlet 过滤器是否正常运行?如果测试它们不需要加载完整的上下文、数据库和所有内容,则可以加分。

【问题讨论】:

    标签: java spring spring-mvc spring-boot servlet-filters


    【解决方案1】:

    You can register a Filter instance in your MockMvc

    this.mockMvc = MockMvcBuilders.webAppContextSetup( context )
                                  .addFilter(new CORSFilter(), "/*")
                                  .build();
    

    【讨论】:

    • 这里重要的是 mockMvc 是手动构建的。如果使用自动配置的 mockMvc,测试上下文中的所有可用过滤器都将添加到其中,在我的情况下,这会在测试 spring 安全性时导致不良影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2015-07-08
    • 2011-07-03
    • 2014-06-19
    • 2018-09-09
    相关资源
    最近更新 更多