Java 我应该如何测试Servlet过滤器?
在确定如何测试servlet过滤器时遇到困难Java 我应该如何测试Servlet过滤器?,java,spring,spring-mvc,spring-boot,servlet-filters,Java,Spring,Spring Mvc,Spring Boot,Servlet Filters,在确定如何测试servlet过滤器时遇到困难 @Component @Order( Ordered.HIGHEST_PRECEDENCE ) class CORSFilter extends OncePerRequestFilter { private final Logger log = LoggerFactory.getLogger( CORSFilter.class ); @Override protected void doFilterInternal(
@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过滤器是否正常工作?如果测试它们不需要加载完整的上下文、db和all,则会获得额外的分数。
这里重要的是mockMvc是手工构建的。如果使用自动配置的mockMvc,测试上下文中所有可用的过滤器都将被添加到其中,在我的例子中,这会在测试spring安全性时导致不良效果。
this.mockMvc = MockMvcBuilders.webAppContextSetup( context )
.addFilter(new CORSFilter(), "/*")
.build();