Я пытаюсь написать модульный тест для моего фильтра OncePerRequestFilter. Проблема заключается в том, что компонент Autowired отображается как null внутри "public OncePerRequestFilter clientInterceptorFilter ()" только в модульном тесте. Фрагменты кода моего модульного теста и класса Filter скопированы ниже. Кто-нибудь может подсказать мне, как я могу ввести зависимые бины в фильтр сервлетов.
Код тестового модуля находится здесь
@RunWith(SpringRunner.class)
@ImportAutoConfiguration({ RefreshAutoConfiguration.class })
@TestPropertySource(locations = "classpath:application.properties")
@Import({ FilterConfig.class, IAuthServiceClient.class, AppConfig.class })
// @TestExecutionListeners({
// DependencyInjectionTestExecutionListener.class,
// DirtiesContextTestExecutionListener.class})
public class FilterConfigTest implements AppConstants {
@MockBean
private IAuthServiceClient authService;
@Autowired
FilterConfig config;
@Autowired
ResourceLoader loader;
@Autowired
AppConfig appconfig;
private MockHttpServletRequest request;
private MockHttpServletResponse response;
private MockFilterChain chain;
private OncePerRequestFilter filter;
@SuppressWarnings("serial")
@Before
public void setUp() throws Exception {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
chain = new MockFilterChain();
filter = new FilterConfig().clientInterceptorFilter();
}
@Test
public void validTokenTest() throws IOException, ServletException {
BDDMockito.given(authService.getPrincipal(anyString(), anyList())).willReturn(getStubbedPrincipal());
this.request.addHeader(HttpHeaders.AUTHORIZATION, "sometoken");
this.request.addHeader(XH_AUTH_HEADER, "someauthheader");
this.filter.doFilter(this.request, this.response, this.chain);
}
}
Мой класс фильтра ниже. И "authService", и "config" имеют значение null внутри функции "public OncePerRequestFilter clientInterceptorFilter ()"
@Configuration
public class FilterConfig implements AppConstants {
@Autowired
private IAuthServiceClient authService;
@Autowired
AppConfig config;
private final static Logger logger = LoggerFactory.getLogger(FilterConfig.class);
@Bean
public OncePerRequestFilter clientInterceptorFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String authorization = Optional.ofNullable(request.getHeader(HttpHeaders.AUTHORIZATION)).orElse(null);
String xhAuth = Optional.ofNullable(request.getHeader(XH_AUTH_HEADER)).orElse(null);
List<String> scopes = config.getscopesAsList();
try {
Principal principal = authService.getPrincipal(authorization, scopes);
if(principal != null) {
//do something
filterChain.doFilter(request, response);
}
} catch (Exception e) {
throw new NoAuthorizedPrincipalFound(HttpStatus.UNAUTHORIZED, INVALID_AUTOIRIZED_PRINCIPAL);
}
}
};
}
}