Pass in filter's name when adding to MockMvc

Closes gh-38001
This commit is contained in:
Andy Wilkinson 2023-10-24 11:26:13 +01:00
parent 4c3de96d74
commit 0950d4416a
3 changed files with 38 additions and 13 deletions

View File

@ -116,8 +116,8 @@ public class SpringBootMockMvcBuilderCustomizer implements MockMvcBuilderCustomi
private void addFilter(ConfigurableMockMvcBuilder<?> builder, AbstractFilterRegistrationBean<?> registration) { private void addFilter(ConfigurableMockMvcBuilder<?> builder, AbstractFilterRegistrationBean<?> registration) {
Filter filter = registration.getFilter(); Filter filter = registration.getFilter();
Collection<String> urls = registration.getUrlPatterns(); Collection<String> urls = registration.getUrlPatterns();
builder.addFilter(filter, registration.getInitParameters(), registration.determineDispatcherTypes(), builder.addFilter(filter, registration.getFilterName(), registration.getInitParameters(),
StringUtils.toStringArray(urls)); registration.determineDispatcherTypes(), StringUtils.toStringArray(urls));
} }
public void setAddFilters(boolean addFilters) { public void setAddFilters(boolean addFilters) {

View File

@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
@ -66,15 +67,18 @@ class SpringBootMockMvcBuilderCustomizerTests {
DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(context); DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(context);
SpringBootMockMvcBuilderCustomizer customizer = new SpringBootMockMvcBuilderCustomizer(context); SpringBootMockMvcBuilderCustomizer customizer = new SpringBootMockMvcBuilderCustomizer(context);
customizer.customize(builder); customizer.customize(builder);
FilterRegistrationBean<?> registrationBean = (FilterRegistrationBean<?>) context FilterRegistrationBean<?> registrationBean = (FilterRegistrationBean<?>) context.getBean("otherTestFilter");
.getBean("filterRegistrationBean"); TestFilter testFilter = context.getBean("testFilter", TestFilter.class);
Filter testFilter = (Filter) context.getBean("testFilter"); OtherTestFilter otherTestFilter = (OtherTestFilter) registrationBean.getFilter();
Filter otherTestFilter = registrationBean.getFilter();
assertThat(builder).extracting("filters", as(InstanceOfAssertFactories.LIST)) assertThat(builder).extracting("filters", as(InstanceOfAssertFactories.LIST))
.extracting("delegate", "initParams", "dispatcherTypes") .extracting("delegate", "dispatcherTypes")
.containsExactlyInAnyOrder(tuple(testFilter, Collections.emptyMap(), EnumSet.of(DispatcherType.REQUEST)), .containsExactlyInAnyOrder(tuple(testFilter, EnumSet.of(DispatcherType.REQUEST)),
tuple(otherTestFilter, Map.of("a", "alpha", "b", "bravo"), tuple(otherTestFilter, EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR)));
EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR))); builder.build();
assertThat(testFilter.filterName).isEqualTo("testFilter");
assertThat(testFilter.initParams).isEmpty();
assertThat(otherTestFilter.filterName).isEqualTo("otherTestFilter");
assertThat(otherTestFilter.initParams).isEqualTo(Map.of("a", "alpha", "b", "bravo"));
} }
@Test @Test
@ -137,7 +141,7 @@ class SpringBootMockMvcBuilderCustomizerTests {
static class FilterConfiguration { static class FilterConfiguration {
@Bean @Bean
FilterRegistrationBean<OtherTestFilter> filterRegistrationBean() { FilterRegistrationBean<OtherTestFilter> otherTestFilter() {
FilterRegistrationBean<OtherTestFilter> filterRegistrationBean = new FilterRegistrationBean<>( FilterRegistrationBean<OtherTestFilter> filterRegistrationBean = new FilterRegistrationBean<>(
new OtherTestFilter()); new OtherTestFilter());
filterRegistrationBean.setInitParameters(Map.of("a", "alpha", "b", "bravo")); filterRegistrationBean.setInitParameters(Map.of("a", "alpha", "b", "bravo"));
@ -158,9 +162,15 @@ class SpringBootMockMvcBuilderCustomizerTests {
static class TestFilter implements Filter { static class TestFilter implements Filter {
private String filterName;
private Map<String, String> initParams = new HashMap<>();
@Override @Override
public void init(FilterConfig filterConfig) { public void init(FilterConfig filterConfig) {
this.filterName = filterConfig.getFilterName();
Collections.list(filterConfig.getInitParameterNames())
.forEach((name) -> this.initParams.put(name, filterConfig.getInitParameter(name)));
} }
@Override @Override
@ -177,9 +187,15 @@ class SpringBootMockMvcBuilderCustomizerTests {
static class OtherTestFilter implements Filter { static class OtherTestFilter implements Filter {
private String filterName;
private Map<String, String> initParams = new HashMap<>();
@Override @Override
public void init(FilterConfig filterConfig) { public void init(FilterConfig filterConfig) {
this.filterName = filterConfig.getFilterName();
Collections.list(filterConfig.getInitParameterNames())
.forEach((name) -> this.initParams.put(name, filterConfig.getInitParameter(name)));
} }
@Override @Override

View File

@ -265,6 +265,15 @@ public abstract class AbstractFilterRegistrationBean<T extends Filter> extends D
*/ */
public abstract T getFilter(); public abstract T getFilter();
/**
* Returns the filter name that will be registered.
* @return the filter name
* @since 3.2.0
*/
public String getFilterName() {
return getOrDeduceName(getFilter());
}
@Override @Override
public String toString() { public String toString() {
StringBuilder builder = new StringBuilder(getOrDeduceName(this)); StringBuilder builder = new StringBuilder(getOrDeduceName(this));