Как выполнить модульное тестирование с помощью фильтра сервлетов, который обращается к другим бинам? - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь написать модульный тест для моего фильтра 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);

                    }

                }
            };
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...