Me sorprendió bastante ver que IntelliJ realmente hace tiempo de ejecución verificación de @NotNull dentro de IDEA al ejecutar/depurar una prueba unitaria. ¿Es posible para mí agregar esta misma característica a mi construcción maven? (¿Qué tarros/Valores de JVM hacer que requiero?)Cómo agregar el procesamiento en tiempo de ejecución de la anotación @NotNull
Respuesta
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.
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).
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
- 1. Java: la reflexión (en tiempo de ejecución) frente al espejo (en el procesamiento de anotación)
- 2. Cómo acceder anotación definido en el campo de la clase en tiempo de ejecución caso
- 3. Agregar imagen en tiempo de ejecución
- 4. obtener la información de la anotación en el tiempo de ejecución
- 5. Agregar DLL mediante programación en el tiempo de ejecución
- 6. ¿Cómo usar layoutinflator para agregar vistas en tiempo de ejecución?
- 7. La mejor práctica para agregar controles en tiempo de ejecución
- 8. Agregar archivos a Java classpath en el tiempo de ejecución
- 9. ¿Cómo agregar margen a un botón en tiempo de ejecución?
- 10. Cómo agregar un UIButton en tiempo de ejecución
- 11. ¿Cómo puedo establecer un argumento de expresión regular de la anotación de datos de RegularExpression en el tiempo de ejecución?
- 12. ¿Se pueden determinar las variables de anotación en el tiempo de ejecución?
- 13. cómo agregar tiempo en el tiempo actual
- 14. Agregar funciones en gdb en tiempo de ejecución
- 15. Agregar clases de entidad dinámicamente en tiempo de ejecución
- 16. Agregar imagen al informe de Crystal En tiempo de ejecución
- 17. ¿Cómo puedo agregar un elemento de la barra de acciones durante el tiempo de ejecución
- 18. ¿Es posible agregar ruta en tiempo de ejecución en MVC3?
- 19. Agregar miembros a un objeto dinámico en tiempo de ejecución
- 20. Agregar elementos a RibbonDropDown en tiempo de ejecución
- 21. medir el tiempo de procesamiento de la llamada AJAX
- 22. Tiempo de procesamiento de páginas en MVC
- 23. Java procesamiento 6 de anotación - conseguir una clase desde una anotación
- 24. ¿Cómo agregar imágenes en el archivo de recursos incrustado en tiempo de ejecución?
- 25. Cargando jar en el tiempo de ejecución
- 26. Java Swing agregar/eliminar jButtons en tiempo de ejecución
- 27. Cómo modificar el archivo strings.xml en tiempo de ejecución
- 28. Agregando una anotación a un método/clase generados en tiempo de ejecución usando Javassist
- 29. Cómo cargar un archivo jar en el tiempo de ejecución
- 30. Java 6 configuración de procesamiento de anotación con Ant
Es javac2.jar un reemplazo para tools.jar? – krosenvold
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
@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