如何在运行时处理@NotNull注释

11
我很惊讶地发现,在运行/调试单元测试时,IntelliJ实际上会对IDEA中的@NotNull进行运行时验证。我能否将相同的功能添加到我的maven构建中呢?(我需要哪些jars/jvm设置?)
4个回答

5
IDEA使用自己的字节码检测方法来添加验证。 对于命令行构建,我们提供javac2 Ant任务进行检测(扩展标准javac任务)。如果您从IDEA生成Ant构建,您将有一个选项可以使用javac2。
尽管存在一些老版本问题,有第三方版本,但我们还没有提供类似的Maven插件。

javac2.jar是tools.jar的替代品吗? - krosenvold
不,这只是一个Ant任务,通过添加GUI表单和注释仪器来扩展Ant javac任务。此任务的源代码可在IDEA Community Edition git存储库中获得。 - CrazyCoder
1
@CrazyCoder,有没有一种方法可以在我想测试空指针行为的单元测试中关闭处理?例如:@org.junit.Test(expected = NullPointerException.class) 测试? - Martin

1
我会选择AOP的方式:
首先,您需要一个javax.validation兼容的验证器(Hibernate Validator是参考实现)。
现在创建一个aspectj方面,它具有一个验证器实例,并检查所有方法参数是否存在验证错误。以下是一个快速版本,可帮助您入门:
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将该方面织入您的测试和/或生产代码中。
如果您只想在测试中使用此功能,可以将aspectj插件执行放在配置文件中。

1

-1

你可以在 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单元测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接