20
20
import java .lang .annotation .RetentionPolicy ;
21
21
import java .lang .reflect .Method ;
22
22
23
- import jakarta .validation .ValidationException ;
23
+ import jakarta .validation .ConstraintViolationException ;
24
+ import jakarta .validation .Validation ;
24
25
import jakarta .validation .Validator ;
25
26
import jakarta .validation .constraints .Max ;
26
27
import jakarta .validation .constraints .NotNull ;
27
28
import jakarta .validation .groups .Default ;
28
29
import org .aopalliance .intercept .MethodInterceptor ;
29
30
import org .aopalliance .intercept .MethodInvocation ;
30
31
import org .junit .jupiter .api .Test ;
32
+ import org .junit .jupiter .params .ParameterizedTest ;
33
+ import org .junit .jupiter .params .provider .ValueSource ;
31
34
32
35
import org .springframework .aop .framework .ProxyFactory ;
33
36
import org .springframework .beans .MutablePropertyValues ;
46
49
import org .springframework .util .ClassUtils ;
47
50
import org .springframework .util .ReflectionUtils ;
48
51
import org .springframework .validation .annotation .Validated ;
52
+ import org .springframework .validation .method .MethodValidationException ;
49
53
50
54
import static org .assertj .core .api .Assertions .assertThat ;
51
55
import static org .assertj .core .api .Assertions .assertThatExceptionOfType ;
59
63
*/
60
64
class MethodValidationProxyTests {
61
65
62
- @ Test
66
+ @ ParameterizedTest
67
+ @ ValueSource (booleans = {true , false })
63
68
@ SuppressWarnings ("unchecked" )
64
- public void testMethodValidationInterceptor () {
69
+ void testMethodValidationInterceptor (boolean adaptViolations ) {
65
70
MyValidBean bean = new MyValidBean ();
66
71
ProxyFactory factory = new ProxyFactory (bean );
67
- factory .addAdvice (new MethodValidationInterceptor ());
72
+ factory .addAdvice (adaptViolations ?
73
+ new MethodValidationInterceptor (() -> Validation .buildDefaultValidatorFactory ().getValidator (), true ) :
74
+ new MethodValidationInterceptor ());
68
75
factory .addAdvisor (new AsyncAnnotationAdvisor ());
69
- doTestProxyValidation ((MyValidInterface <String >) factory .getProxy ());
76
+ doTestProxyValidation ((MyValidInterface <String >) factory .getProxy (),
77
+ (adaptViolations ? MethodValidationException .class : ConstraintViolationException .class ));
70
78
}
71
79
72
- @ Test
80
+ @ ParameterizedTest
81
+ @ ValueSource (booleans = {true , false })
73
82
@ SuppressWarnings ("unchecked" )
74
- public void testMethodValidationPostProcessor () {
83
+ void testMethodValidationPostProcessor (boolean adaptViolations ) {
75
84
StaticApplicationContext context = new StaticApplicationContext ();
76
- context .registerSingleton ("mvpp" , MethodValidationPostProcessor .class );
85
+ context .registerBean (MethodValidationPostProcessor .class , adaptViolations ?
86
+ () -> {
87
+ MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor ();
88
+ postProcessor .setAdaptConstraintViolations (true );
89
+ return postProcessor ;
90
+ } :
91
+ MethodValidationPostProcessor ::new );
77
92
MutablePropertyValues pvs = new MutablePropertyValues ();
78
93
pvs .add ("beforeExistingAdvisors" , false );
79
94
context .registerSingleton ("aapp" , AsyncAnnotationBeanPostProcessor .class , pvs );
80
95
context .registerSingleton ("bean" , MyValidBean .class );
81
96
context .refresh ();
82
- doTestProxyValidation (context .getBean ("bean" , MyValidInterface .class ));
97
+ doTestProxyValidation (context .getBean ("bean" , MyValidInterface .class ),
98
+ adaptViolations ? MethodValidationException .class : ConstraintViolationException .class );
83
99
context .close ();
84
100
}
85
101
@@ -91,21 +107,21 @@ public void testMethodValidationPostProcessorForInterfaceOnlyProxy() {
91
107
context .registerBean (MyValidInterface .class , () ->
92
108
ProxyFactory .getProxy (MyValidInterface .class , new MyValidClientInterfaceMethodInterceptor ()));
93
109
context .refresh ();
94
- doTestProxyValidation (context .getBean (MyValidInterface .class ));
110
+ doTestProxyValidation (context .getBean (MyValidInterface .class ), ConstraintViolationException . class );
95
111
context .close ();
96
112
}
97
113
98
114
@ SuppressWarnings ("DataFlowIssue" )
99
- private void doTestProxyValidation (MyValidInterface <String > proxy ) {
115
+ private void doTestProxyValidation (MyValidInterface <String > proxy , Class <? extends Exception > expectedExceptionClass ) {
100
116
assertThat (proxy .myValidMethod ("value" , 5 )).isNotNull ();
101
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidMethod ("value" , 15 ));
102
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidMethod (null , 5 ));
103
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidMethod ("value" , 0 ));
117
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidMethod ("value" , 15 ));
118
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidMethod (null , 5 ));
119
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidMethod ("value" , 0 ));
104
120
proxy .myValidAsyncMethod ("value" , 5 );
105
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidAsyncMethod ("value" , 15 ));
106
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidAsyncMethod (null , 5 ));
121
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidAsyncMethod ("value" , 15 ));
122
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidAsyncMethod (null , 5 ));
107
123
assertThat (proxy .myGenericMethod ("myValue" )).isEqualTo ("myValue" );
108
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myGenericMethod (null ));
124
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myGenericMethod (null ));
109
125
}
110
126
111
127
@ Test
0 commit comments