2011-08-10 9 views

Respuesta

0

me gustaría ir el camino AOP:

En primer lugar se necesita un validador compatibles javax.validation (Hibernate Validator es la implementación de referencia).

Ahora cree un aspecto aspectj que tenga una instancia Validator y verifique todos los parámetros del método para ver si hay errores de validación. Aquí es una versión rápida para empezar:

public aspect ValidationAspect { 

    private final Validator validator; 

    { 
     final ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
     validator = factory.getValidator(); 

    } 

    pointcut serviceMethod() : execution(public * com.yourcompany**.*(..)); 

    before() : serviceMethod(){ 
     final Method method = (Method) thisJoinPoint.getTarget(); 
     for(final Object arg : thisJoinPoint.getArgs()){ 
      if(arg!=null) validateArg(arg,method); 
     } 
    } 

    private void validateArg(final Object arg, final Method method) { 
     final Set<ConstraintViolation<Object>> validationErrors = validator.validate(arg); 
     if(!validationErrors.isEmpty()){ 
      final StringBuilder sb = new StringBuilder(); 
      sb.append("Validation Errors in method ").append(method).append(":\n"); 
      for (final ConstraintViolation<Object> constraintViolation : validationErrors) { 
       sb.append(" - ").append(constraintViolation.getMessage()).append("\n"); 
      } 
      throw new RuntimeException(sb.toString()); 
     } 
    } 

} 

Utilice la aspectj-maven-plugin para tejer ese aspecto en su prueba y/o código de producción.

Si solo desea esta funcionalidad para probar, puede colocar la ejecución de aspectj-plugin en un perfil.

4

IDEA está utilizando su propio método de instrumentación de bytecode para agregar tales validaciones. Para compilaciones de línea de comando, proporcionamos la tarea javac2 Ant que hace la instrumentación (extiende la tarea javac estándar). Si genera Ant build desde IDEA, tendrá la opción de usar javac2.

We don't provide similar Maven plug-in yet, pero there is third-party version que puede funcionar para usted (aunque, parece ser un poco viejo).

+0

Es javac2.jar un reemplazo para tools.jar? – krosenvold

+0

No, es solo una tarea Ant que amplía la tarea Ant javac agregando formas de GUI e instrumentación de anotaciones. El código fuente para esta tarea está disponible en el repositorio de git de IDEA Community Edition. – CrazyCoder

+1

@CrazyCoder ¿Hay alguna forma de desactivar el procesamiento de pruebas unitarias donde quiero probar el comportamiento del puntero nulo? es decir. Pruebas '@ org.junit.Test (expected = NullPointerException.class)'? – Martin

0

Puede hacer la validación de anotación en sus pruebas JUnit.

import java.util.Set; 

import javax.validation.ConstraintViolation; 

import junit.framework.Assert; 

import org.hibernate.validator.HibernateValidator; 
import org.junit.Before; 
import org.junit.Test; 
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; 

public class Temp { 
    private LocalValidatorFactoryBean localValidatorFactory; 

    @Before 
    public void setup() { 
     localValidatorFactory = new LocalValidatorFactoryBean(); 
     localValidatorFactory.setProviderClass(HibernateValidator.class); 
     localValidatorFactory.afterPropertiesSet(); 
    } 
    @Test 
    public void testLongNameWithInvalidCharCausesValidationError() { 
     final ProductModel productModel = new ProductModel(); 
     productModel.setLongName("A long name with\t a Tab character"); 
     Set<ConstraintViolation<ProductModel>> constraintViolations = localValidatorFactory.validate(productModel); 
     Assert.assertTrue("Expected validation error not found", constraintViolations.size() == 1); 
    } 
} 

Si el veneno es la primavera, echar un vistazo a estos Spring Unit Tests

Cuestiones relacionadas