Skip to content

Commit 56394aa

Browse files
committed
Assert a JSR validator is created if a Spring validator is defined
This commit restores and adds tests that validates `ValidationAutoConfiguration` will configure a JSR validator even if a Spring Validator is present. Closes spring-projectsgh-8976
1 parent e3545fa commit 56394aa

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/validation/ValidationAutoConfigurationTests.java

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,18 @@
3232
import org.springframework.context.annotation.Bean;
3333
import org.springframework.context.annotation.Configuration;
3434
import org.springframework.validation.annotation.Validated;
35+
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
3536
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
37+
import org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean;
3638

3739
import static org.assertj.core.api.Assertions.assertThat;
40+
import static org.mockito.Mockito.mock;
3841

3942
/**
4043
* Tests for {@link ValidationAutoConfiguration}.
4144
*
4245
* @author Stephane Nicoll
46+
* @author Phillip Webb
4347
*/
4448
public class ValidationAutoConfigurationTests {
4549

@@ -55,6 +59,62 @@ public void close() {
5559
}
5660
}
5761

62+
@Test
63+
public void validationAutoConfigurationShouldConfigureDefaultValidator() {
64+
load(Config.class);
65+
String[] jsrValidatorNames = this.context.getBeanNamesForType(Validator.class);
66+
String[] springValidatorNames = this.context
67+
.getBeanNamesForType(org.springframework.validation.Validator.class);
68+
assertThat(jsrValidatorNames).containsExactly("defaultValidator");
69+
assertThat(springValidatorNames).containsExactly("defaultValidator");
70+
Validator jsrValidator = this.context.getBean(Validator.class);
71+
org.springframework.validation.Validator springValidator = this.context
72+
.getBean(org.springframework.validation.Validator.class);
73+
assertThat(jsrValidator).isInstanceOf(LocalValidatorFactoryBean.class);
74+
assertThat(jsrValidator).isEqualTo(springValidator);
75+
}
76+
77+
@Test
78+
public void validationAutoConfigurationWhenUserProvidesValidatorShouldBackOff() {
79+
load(UserDefinedValidatorConfig.class);
80+
String[] jsrValidatorNames = this.context.getBeanNamesForType(Validator.class);
81+
String[] springValidatorNames = this.context
82+
.getBeanNamesForType(org.springframework.validation.Validator.class);
83+
assertThat(jsrValidatorNames).containsExactly("customValidator");
84+
assertThat(springValidatorNames).containsExactly("customValidator");
85+
org.springframework.validation.Validator springValidator = this.context
86+
.getBean(org.springframework.validation.Validator.class);
87+
Validator jsrValidator = this.context.getBean(Validator.class);
88+
assertThat(jsrValidator).isInstanceOf(OptionalValidatorFactoryBean.class);
89+
assertThat(jsrValidator).isEqualTo(springValidator);
90+
}
91+
92+
@Test
93+
public void validationAutoConfigurationWhenUserProvidesJsrValidatorShouldBackOff() {
94+
load(UserDefinedJsrValidatorConfig.class);
95+
String[] jsrValidatorNames = this.context.getBeanNamesForType(Validator.class);
96+
String[] springValidatorNames = this.context
97+
.getBeanNamesForType(org.springframework.validation.Validator.class);
98+
assertThat(jsrValidatorNames).containsExactly("customValidator");
99+
assertThat(springValidatorNames).isEmpty();
100+
}
101+
102+
@Test
103+
public void validationAutoConfigurationWhenUserProvidesSpringValidatorShouldCreateJsrValidator() {
104+
load(UserDefinedSpringValidatorConfig.class);
105+
String[] jsrValidatorNames = this.context.getBeanNamesForType(Validator.class);
106+
String[] springValidatorNames = this.context
107+
.getBeanNamesForType(org.springframework.validation.Validator.class);
108+
assertThat(jsrValidatorNames).containsExactly("defaultValidator");
109+
assertThat(springValidatorNames)
110+
.containsExactly("customValidator", "defaultValidator");
111+
Validator jsrValidator = this.context.getBean(Validator.class);
112+
org.springframework.validation.Validator springValidator = this.context
113+
.getBean(org.springframework.validation.Validator.class);
114+
assertThat(jsrValidator).isInstanceOf(LocalValidatorFactoryBean.class);
115+
assertThat(jsrValidator).isEqualTo(springValidator);
116+
}
117+
58118
@Test
59119
public void validationIsEnabled() {
60120
load(SampleService.class);
@@ -115,6 +175,41 @@ public void load(Class<?> config, String... environment) {
115175
this.context = ctx;
116176
}
117177

178+
@Configuration
179+
static class Config {
180+
181+
}
182+
183+
@Configuration
184+
static class UserDefinedValidatorConfig {
185+
186+
@Bean
187+
public OptionalValidatorFactoryBean customValidator() {
188+
return new OptionalValidatorFactoryBean();
189+
}
190+
191+
}
192+
193+
@Configuration
194+
static class UserDefinedJsrValidatorConfig {
195+
196+
@Bean
197+
public Validator customValidator() {
198+
return mock(Validator.class);
199+
}
200+
201+
}
202+
203+
@Configuration
204+
static class UserDefinedSpringValidatorConfig {
205+
206+
@Bean
207+
public org.springframework.validation.Validator customValidator() {
208+
return mock(org.springframework.validation.Validator.class);
209+
}
210+
211+
}
212+
118213
@Validated
119214
static class SampleService {
120215

0 commit comments

Comments
 (0)