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) {
Filter filter = registration.getFilter();
Collection<String> urls = registration.getUrlPatterns();
builder.addFilter(filter, registration.getInitParameters(), registration.determineDispatcherTypes(),
StringUtils.toStringArray(urls));
builder.addFilter(filter, registration.getFilterName(), registration.getInitParameters(),
registration.determineDispatcherTypes(), StringUtils.toStringArray(urls));
}
public void setAddFilters(boolean addFilters) {

View File

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

View File

@ -265,6 +265,15 @@ public abstract class AbstractFilterRegistrationBean<T extends Filter> extends D
*/
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
public String toString() {
StringBuilder builder = new StringBuilder(getOrDeduceName(this));