我写了一个过滤器,里面注入了一个依赖,正常启动的时候这个依赖是可以使用的。不过在单元测试中调用过滤器时,这个依赖为null,导致过滤器无法继续执行。
单测:
@RunWith(PandoraBootRunner.class)
@DelegateTo(MockitoJUnitRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class FilterTest {
private AuthorityManagementFilter filter = new AuthorityManagementFilter();
@Test
public void testDoFilter() {
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
MockFilterChain filterChain = new MockFilterChain();
req.setRequestURI("/test/junit");
req.setParameter("name", "test_name");
try {
filter.doFilter(req, res, filterChain);
} catch (Exception e) {
e.printStackTrace();
}
}
过滤器:
@Slf4j
@WebFilter(urlPatterns = "/api/*")
public class AuthorityManagementFilter implements Filter {
@Resource
private CustomerConfigLoader customerConfigLoader;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
ServletContext context = filterConfig.getServletContext();
try {
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
if (ctx != null) {
customerConfigLoader = ctx.getBean(CustomerConfigLoader.class);
}
} catch (Exception e) {
log.error("SsoFilter Exception: {}", e);
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
List<CustomerConfig> customer = customerConfigLoader.getConfigs();
注入的customerConfigLoader还是null
在单测内导入依赖可以成功,但是在过滤器就不可以。我试过换注解和手动authorityManagementFilter.init(mockFilterConfig);但是mockFilterConfig.getServletContext()是null
想要将单测覆盖超过百分之五十,但是开头就需要获取这个customer ,如果为null的话就不可能继续执行过滤器doFilter方法,希望您能帮助我。
private AuthorityManagementFilter filter = new AuthorityManagementFilter();
你不应该通过new的方式创建filter的,应该使用依赖注入的方式创建 @Autowired/@Resource
因为你单测的时候,Filter 中的 init()方法并没有调用,所以等于没有初始化 CustomerConfigLoader 这个 Bean,以至于 你去调用是 null,你得将初始化这个操作 @Before。