Я сделал собственный фильтр и зарегистрировался в WebConfig, но когда я вызываю api, фильтр не вызывается. Я просмотрел журнал и, похоже, цепочка фильтров, которую я описал в конфигурации, не применяется. Однако я проверил, что WebConfig вызывается с помощью отладчика.

//MyFilter.java
@Component
public class MyFilter implements Filter {
  @Override
  doFilter(...) { // This part is NOT getting invoked
    ...
  }
}
//WebConfig.java
@Configuration
public class WebConfig {
  @Bean
  public FilterRegistrationBean<MyFilter> myFilter() { // This part is getting invoked
    regBean = new FilterRegistrationBean();
    regBean.setFilter(new MyFilter());
    regBean.setOrder(0);
    return regBean;
  }
}
//MyTest.java
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyApplication.class)
public class MyTest {
  
  private MockMvc mockMvc;

  @Autowired
  WebApplicationContext ctx;

  @Before
  public void before() {
    mockMvc = MockMvcBuilders.webApplicationSetup(ctx).build();
  }

  @Test
  public void doTest() {
    mockMvc.perform(...);
  }
}
1
Lee Jeonghyun 18 Ноя 2021 в 09:27
Удалите @ContextConfiguration, добавьте @AutoConfigureMockMvc. Откажитесь от аннотированного метода @Before и добавьте @Autowired в поле MockMvc. Затем повторно запустите тест.
 – 
M. Deinum
18 Ноя 2021 в 09:29
Удаление @ContextConfiguration вызывает IllegalStateException, поэтому я не могу запустить тест без него.
 – 
Lee Jeonghyun
18 Ноя 2021 в 09:34
Что странно, так как он должен автоматически обнаруживать аннотированный класс @SpringBootApplication (если у вас нет какой-то странной нестандартной структуры упаковки). Не могли бы вы добавить исключение ( полную трассировку стека исключений ) в свой вопрос в качестве обновления.
 – 
M. Deinum
18 Ноя 2021 в 09:36
В вашем тесте это правда? @ContextConfiguration(classes = MyApplication.class) или @ContextConfiguration(classes = WebConfig.class) или это просто пример, который вы разместили?
 – 
Jayesh
18 Ноя 2021 в 09:37
Лучше использовать @AutoConfiguraMockMvc, и вы можете автоматически подключить его в интеграционном тесте
 – 
Gurkan İlleez
18 Ноя 2021 в 09:44

1 ответ

Лучший ответ
this.mockMvc = MockMvcBuilders.webApplicationSetup(ctx)
            .addFilters(filter).build();

Если вы не используете @AutoConfiguraMockMvc, вам необходимо добавить фильтры в конструктор mockMvc.

Что требуется, чтобы mockMVC тестировал процедуру инициализации фильтра?

Также здесь есть проблема с конфигурацией.

@Bean
  public FilterRegistrationBean<MyFilter> myFilter(MyFilter myfilter) { // This part is getting invoked
    regBean = new FilterRegistrationBean();
    regBean.setFilter(myFilter);
    regBean.setOrder(0);
    return regBean;
  }

Вы помещаете новый экземпляр фильтра в цепочку фильтров, но создаете одноэлементный фильтр. Вы можете использовать указанную выше конфигурацию.

0
Gurkan İlleez 18 Ноя 2021 в 09:52
Кредиты на FilterRegistrationBean теперь он фактически добавляет 2 фильтра в цепочку. Однако при использовании @SpringBootTest вы должны использовать @AutoConfigureMockMvc, чтобы применить правильную конфигурацию фильтров и т. Д.
 – 
M. Deinum
18 Ноя 2021 в 10:57
Я добавил эту строку предложений: «Если вы не используете @AutoConfiguraMockMvc, вам нужно добавить фильтры в конструктор mockMvc».
 – 
Gurkan İlleez
18 Ноя 2021 в 11:56