Skip to content

Commit daa903a

Browse files
committed
Add filters to MockMvc with their init params and dispatcher types
Closes gh-37835
1 parent 02c49b0 commit daa903a

File tree

3 files changed

+47
-22
lines changed

3 files changed

+47
-22
lines changed

Diff for: spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/SpringBootMockMvcBuilderCustomizer.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,8 @@ private void addFilters(ConfigurableMockMvcBuilder<?> builder) {
116116
private void addFilter(ConfigurableMockMvcBuilder<?> builder, AbstractFilterRegistrationBean<?> registration) {
117117
Filter filter = registration.getFilter();
118118
Collection<String> urls = registration.getUrlPatterns();
119-
if (urls.isEmpty()) {
120-
builder.addFilters(filter);
121-
}
122-
else {
123-
builder.addFilter(filter, StringUtils.toStringArray(urls));
124-
}
119+
builder.addFilter(filter, registration.getInitParameters(), registration.determineDispatcherTypes(),
120+
StringUtils.toStringArray(urls));
125121
}
126122

127123
public void setAddFilters(boolean addFilters) {

Diff for: spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/SpringBootMockMvcBuilderCustomizerTests.java

+22-5
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.Arrays;
21+
import java.util.Collections;
22+
import java.util.EnumSet;
2123
import java.util.List;
24+
import java.util.Map;
2225
import java.util.concurrent.CountDownLatch;
2326
import java.util.concurrent.TimeUnit;
2427

28+
import jakarta.servlet.DispatcherType;
2529
import jakarta.servlet.Filter;
2630
import jakarta.servlet.FilterChain;
2731
import jakarta.servlet.FilterConfig;
2832
import jakarta.servlet.ServletRequest;
2933
import jakarta.servlet.ServletResponse;
3034
import jakarta.servlet.http.HttpServlet;
35+
import org.assertj.core.api.InstanceOfAssertFactories;
3136
import org.junit.jupiter.api.Test;
3237

3338
import org.springframework.boot.test.autoconfigure.web.servlet.SpringBootMockMvcBuilderCustomizer.DeferredLinesWriter;
@@ -37,11 +42,12 @@
3742
import org.springframework.context.annotation.Bean;
3843
import org.springframework.context.annotation.Configuration;
3944
import org.springframework.mock.web.MockServletContext;
40-
import org.springframework.test.util.ReflectionTestUtils;
4145
import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder;
4246
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
4347

48+
import static org.assertj.core.api.Assertions.as;
4449
import static org.assertj.core.api.Assertions.assertThat;
50+
import static org.assertj.core.api.Assertions.tuple;
4551

4652
/**
4753
* Tests for {@link SpringBootMockMvcBuilderCustomizer}.
@@ -51,7 +57,6 @@
5157
class SpringBootMockMvcBuilderCustomizerTests {
5258

5359
@Test
54-
@SuppressWarnings("unchecked")
5560
void customizeShouldAddFilters() {
5661
AnnotationConfigServletWebApplicationContext context = new AnnotationConfigServletWebApplicationContext();
5762
MockServletContext servletContext = new MockServletContext();
@@ -65,8 +70,11 @@ void customizeShouldAddFilters() {
6570
.getBean("filterRegistrationBean");
6671
Filter testFilter = (Filter) context.getBean("testFilter");
6772
Filter otherTestFilter = registrationBean.getFilter();
68-
List<Filter> filters = (List<Filter>) ReflectionTestUtils.getField(builder, "filters");
69-
assertThat(filters).containsExactlyInAnyOrder(testFilter, otherTestFilter);
73+
assertThat(builder).extracting("filters", as(InstanceOfAssertFactories.LIST))
74+
.extracting("delegate", "initParams", "dispatcherTypes")
75+
.containsExactlyInAnyOrder(tuple(testFilter, Collections.emptyMap(), EnumSet.of(DispatcherType.REQUEST)),
76+
tuple(otherTestFilter, Map.of("a", "alpha", "b", "bravo"),
77+
EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR)));
7078
}
7179

7280
@Test
@@ -130,7 +138,11 @@ static class FilterConfiguration {
130138

131139
@Bean
132140
FilterRegistrationBean<OtherTestFilter> filterRegistrationBean() {
133-
return new FilterRegistrationBean<>(new OtherTestFilter());
141+
FilterRegistrationBean<OtherTestFilter> filterRegistrationBean = new FilterRegistrationBean<>(
142+
new OtherTestFilter());
143+
filterRegistrationBean.setInitParameters(Map.of("a", "alpha", "b", "bravo"));
144+
filterRegistrationBean.setDispatcherTypes(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR));
145+
return filterRegistrationBean;
134146
}
135147

136148
@Bean
@@ -182,4 +194,9 @@ public void destroy() {
182194

183195
}
184196

197+
static record RegisteredFilter(Filter filter, Map<String, String> initParameters,
198+
EnumSet<DispatcherType> dispatcherTypes) {
199+
200+
}
201+
185202
}

Diff for: spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/AbstractFilterRegistrationBean.java

+23-11
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,28 @@ public void addUrlPatterns(String... urlPatterns) {
158158
Collections.addAll(this.urlPatterns, urlPatterns);
159159
}
160160

161+
/**
162+
* Determines the {@link DispatcherType dispatcher types} for which the filter should
163+
* be registered. Applies defaults based on the type of filter being registered if
164+
* none have been configured. Modifications to the returned {@link EnumSet} will have
165+
* no effect on the registration.
166+
* @return the dispatcher types, never {@code null}
167+
* @since 3.2.0
168+
*/
169+
public EnumSet<DispatcherType> determineDispatcherTypes() {
170+
if (this.dispatcherTypes == null) {
171+
T filter = getFilter();
172+
if (ClassUtils.isPresent("org.springframework.web.filter.OncePerRequestFilter",
173+
filter.getClass().getClassLoader()) && filter instanceof OncePerRequestFilter) {
174+
return EnumSet.allOf(DispatcherType.class);
175+
}
176+
else {
177+
return EnumSet.of(DispatcherType.REQUEST);
178+
}
179+
}
180+
return EnumSet.copyOf(this.dispatcherTypes);
181+
}
182+
161183
/**
162184
* Convenience method to {@link #setDispatcherTypes(EnumSet) set dispatcher types}
163185
* using the specified elements.
@@ -216,17 +238,7 @@ protected Dynamic addRegistration(String description, ServletContext servletCont
216238
@Override
217239
protected void configure(FilterRegistration.Dynamic registration) {
218240
super.configure(registration);
219-
EnumSet<DispatcherType> dispatcherTypes = this.dispatcherTypes;
220-
if (dispatcherTypes == null) {
221-
T filter = getFilter();
222-
if (ClassUtils.isPresent("org.springframework.web.filter.OncePerRequestFilter",
223-
filter.getClass().getClassLoader()) && filter instanceof OncePerRequestFilter) {
224-
dispatcherTypes = EnumSet.allOf(DispatcherType.class);
225-
}
226-
else {
227-
dispatcherTypes = EnumSet.of(DispatcherType.REQUEST);
228-
}
229-
}
241+
EnumSet<DispatcherType> dispatcherTypes = determineDispatcherTypes();
230242
Set<String> servletNames = new LinkedHashSet<>();
231243
for (ServletRegistrationBean<?> servletRegistrationBean : this.servletRegistrationBeans) {
232244
servletNames.add(servletRegistrationBean.getServletName());

0 commit comments

Comments
 (0)