diff --git a/spring-context/src/test/java/org/springframework/validation/beanvalidation/MethodValidationProxyTests.java b/spring-context/src/test/java/org/springframework/validation/beanvalidation/MethodValidationProxyTests.java index b2fb1f0fc1..90224491f4 100644 --- a/spring-context/src/test/java/org/springframework/validation/beanvalidation/MethodValidationProxyTests.java +++ b/spring-context/src/test/java/org/springframework/validation/beanvalidation/MethodValidationProxyTests.java @@ -23,13 +23,14 @@ import java.lang.reflect.Method; import jakarta.validation.ConstraintViolationException; import jakarta.validation.Validation; import jakarta.validation.Validator; -import jakarta.validation.ValidatorFactory; import jakarta.validation.constraints.Max; import jakarta.validation.constraints.NotNull; import jakarta.validation.groups.Default; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.springframework.aop.framework.ProxyFactory; import org.springframework.beans.MutablePropertyValues; @@ -47,7 +48,6 @@ import org.springframework.scheduling.annotation.AsyncAnnotationAdvisor; import org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; -import org.springframework.util.function.SingletonSupplier; import org.springframework.validation.annotation.Validated; import org.springframework.validation.method.MethodValidationException; @@ -63,63 +63,44 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; */ class MethodValidationProxyTests { - @Test + @ParameterizedTest + @ValueSource(booleans = {true, false}) @SuppressWarnings("unchecked") - public void testMethodValidationInterceptor() { + void testMethodValidationInterceptor(boolean adaptViolations) { MyValidBean bean = new MyValidBean(); ProxyFactory factory = new ProxyFactory(bean); - factory.addAdvice(new MethodValidationInterceptor()); + factory.addAdvice(adaptViolations ? + new MethodValidationInterceptor(() -> Validation.buildDefaultValidatorFactory().getValidator(), true) : + new MethodValidationInterceptor()); factory.addAdvisor(new AsyncAnnotationAdvisor()); - doTestProxyValidation((MyValidInterface) factory.getProxy(), ConstraintViolationException.class); + doTestProxyValidation((MyValidInterface) factory.getProxy(), + (adaptViolations ? MethodValidationException.class : ConstraintViolationException.class)); } - @Test + @ParameterizedTest + @ValueSource(booleans = {true, false}) @SuppressWarnings("unchecked") - public void testMethodValidationInterceptorWithAdaptConstraintViolations() { - MyValidBean bean = new MyValidBean(); - ProxyFactory factory = new ProxyFactory(bean); - try (ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory()) { - factory.addAdvice(new MethodValidationInterceptor(SingletonSupplier.of(validatorFactory.getValidator()), true)); - factory.addAdvisor(new AsyncAnnotationAdvisor()); - doTestProxyValidation((MyValidInterface) factory.getProxy(), MethodValidationException.class); - } - } - - @Test - @SuppressWarnings("unchecked") - public void testMethodValidationPostProcessor() { + void testMethodValidationPostProcessor(boolean adaptViolations) { StaticApplicationContext context = new StaticApplicationContext(); - context.registerSingleton("mvpp", MethodValidationPostProcessor.class); + context.registerBean(MethodValidationPostProcessor.class, adaptViolations ? + () -> { + MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); + postProcessor.setAdaptConstraintViolations(true); + return postProcessor; + } : + MethodValidationPostProcessor::new); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("beforeExistingAdvisors", false); context.registerSingleton("aapp", AsyncAnnotationBeanPostProcessor.class, pvs); context.registerSingleton("bean", MyValidBean.class); context.refresh(); - doTestProxyValidation(context.getBean("bean", MyValidInterface.class), ConstraintViolationException.class); - context.close(); - } - - @Test - @SuppressWarnings("unchecked") - public void testMethodValidationPostProcessorWithAdaptConstraintViolations() { - StaticApplicationContext context = new StaticApplicationContext(); - context.registerBean(MethodValidationPostProcessor.class, () -> { - MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); - postProcessor.setAdaptConstraintViolations(true); - return postProcessor; - }); - - MutablePropertyValues pvs = new MutablePropertyValues(); - pvs.add("beforeExistingAdvisors", false); - context.registerSingleton("aapp", AsyncAnnotationBeanPostProcessor.class, pvs); - context.registerSingleton("bean", MyValidBean.class); - context.refresh(); - doTestProxyValidation(context.getBean("bean", MyValidInterface.class), MethodValidationException.class); + doTestProxyValidation(context.getBean("bean", MyValidInterface.class), + adaptViolations ? MethodValidationException.class : ConstraintViolationException.class); context.close(); } @Test // gh-29782 - public void testMethodValidationPostProcessorForInterfaceOnlyProxy() { + void testMethodValidationPostProcessorForInterfaceOnlyProxy() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.register(MethodValidationPostProcessor.class); context.registerBean(MyValidInterface.class, () -> @@ -129,23 +110,6 @@ class MethodValidationProxyTests { context.close(); } - @Test - @SuppressWarnings("unchecked") - public void testMethodValidationPostProcessorForInterfaceOnlyProxyWithAdaptConstraintViolations() { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - context.registerBean(MethodValidationPostProcessor.class, () -> { - MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); - postProcessor.setAdaptConstraintViolations(true); - return postProcessor; - }); - - context.registerBean(MyValidInterface.class, () -> - ProxyFactory.getProxy(MyValidInterface.class, new MyValidClientInterfaceMethodInterceptor())); - context.refresh(); - doTestProxyValidation(context.getBean(MyValidInterface.class), MethodValidationException.class); - context.close(); - } - @SuppressWarnings("DataFlowIssue") private void doTestProxyValidation(MyValidInterface proxy, Class expectedExceptionClass) { assertThat(proxy.myValidMethod("value", 5)).isNotNull(); @@ -174,11 +138,6 @@ class MethodValidationProxyTests { doTestLazyValidatorForMethodValidation(LazyMethodValidationConfigWithValidatorProvider.class); } - @Test - void testLazyValidatorForMethodValidationWithAdaptConstraintViolations() { - doTestLazyValidatorForMethodValidation(LazyMethodValidationConfigWithAdaptConstraintViolations.class); - } - private void doTestLazyValidatorForMethodValidation(Class configClass) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.register(configClass, CustomValidatorBean.class, MyValidBean.class, MyValidFactoryBean.class); @@ -335,16 +294,4 @@ class MethodValidationProxyTests { } } - @Configuration - public static class LazyMethodValidationConfigWithAdaptConstraintViolations { - - @Bean - public static MethodValidationPostProcessor methodValidationPostProcessor(ObjectProvider validator) { - MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); - postProcessor.setValidatorProvider(validator); - postProcessor.setAdaptConstraintViolations(true); - return postProcessor; - } - } - }