Как добавить обработку аннотации @NotNull во время выполнения - PullRequest
10 голосов
/ 10 августа 2011

Я был очень удивлен, увидев, что IntelliJ на самом деле во время выполнения проверяет @NotNull в IDEA при запуске / отладке модульного теста. Могу ли я добавить эту же функцию в мою сборку maven? (Какие настройки jars / jvm мне нужны?)

Ответы [ 4 ]

5 голосов
/ 10 августа 2011

IDEA использует собственный метод инструментирования байт-кода для добавления таких проверок. Для сборок из командной строки мы предоставляем задачу Ant javac2, которая выполняет инструментирование (расширяет стандартную задачу javac). Если вы генерируете сборку Ant из IDEA, у вас будет возможность использовать javac2.

Мы еще не предоставили подобный плагин Maven , но существует сторонняя версия , которая может работать для вас (хотя, кажется, она немного устарела) .

1 голос
/ 10 августа 2011

Я бы пошел по пути АОП:

Прежде всего вам нужен javax.validation совместимый валидатор ( Hibernate Validator - эталонная реализация).

Теперь создайте аспект aspectj, который имеет экземпляр Validator и проверяет все параметры метода на наличие ошибок валидации.Вот краткая версия, с которой можно начать:

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());
        }
    }

}

Используйте aspectj-maven-plugin , чтобы встроить этот аспект в свой тестовый и / или производственный код.

Если вам нужна только эта функциональность для тестирования, вы можете поместить выполнение аспекта-плагина в профиль.

0 голосов
/ 09 ноября 2018

Существует плагин maven, тесно связанный с функциональностью IntelliJ, в настоящее время он равен https://github.com/osundblad/intellij-annotations-instrumenter-maven-plugin. Он обсуждается в билете IDEA-31368 , впервые упомянутом в ответе CrazyCoder.

0 голосов
/ 10 августа 2011

Вы можете выполнить проверку аннотаций в своих тестах 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);
    }
}

Если ваш яд - Spring, взгляните на эти тестовые модули Spring *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...