/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.test.internal.engine.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import org.testng.annotations.Test;
import org.hibernate.validator.testutil.TestForIssue;
import org.hibernate.validator.testutils.ValidatorUtil;
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertNumberOfViolations;
import static org.testng.Assert.assertEquals;
/**
* @author Hardy Ferentschik
*/
@TestForIssue(jiraKey = "HV-257")
public class ProxyTest {
@Test
public void testValidateA() {
InvocationHandler handler = new CustomInvocationHandler( "some object" );
A a = (A) Proxy.newProxyInstance( getClass().getClassLoader(), new Class<?>[] { A.class }, handler );
assertEquals( Integer.valueOf( 0 ), a.getInteger() );
Validator validator = ValidatorUtil.getValidator();
Set<ConstraintViolation<A>> violations = validator.validate( a );
assertNumberOfViolations( violations, 2 );
}
@Test
public void testValidateB() {
InvocationHandler handler = new CustomInvocationHandler( "some object" );
B b = (B) Proxy.newProxyInstance( getClass().getClassLoader(), new Class<?>[] { B.class }, handler );
assertEquals( Integer.valueOf( 0 ), b.getInteger() );
Validator validator = ValidatorUtil.getValidator();
Set<ConstraintViolation<B>> violations = validator.validate( b );
assertNumberOfViolations( violations, 2 );
}
private class CustomInvocationHandler implements InvocationHandler {
private Object o;
public CustomInvocationHandler(Object o) {
this.o = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ( "getInteger".equals( method.getName() ) ) {
method.setAccessible( true );
return 0;
}
if ( "getString".equals( method.getName() ) ) {
return "a";
}
return method.invoke( o, args );
}
}
}