2011-08-10 22 views
9

當運行/調試單元測試時,我非常驚訝地發現IntelliJ實際上是運行時在IDEA中驗證了@NotNull。我可以將這個相同的功能添加到我的Maven構建中嗎? (做什麼瓶/ JVM設置我需要?)如何添加@NotNull批註的運行時處理

回答

0

我會去的AOP方式:

首先你需要一個javax.validation兼容驗證(Hibernate Validator是參考實現)。

現在創建一個具有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-plugin執行放入配置文件中。

4

IDEA正在使用自己的方法來測試字節碼以添​​加這樣的驗證。對於命令行構建,我們提供執行插裝的javac2 Ant任務(擴展標準的javac任務)。如果您從IDEA生成Ant構建,則可以選擇使用javac2。

We don't provide similar Maven plug-in yet,但there is third-party version它可能適合你(雖然,它似乎有點舊)。

+0

是javac2.jar對的tools.jar更換? – krosenvold

+0

不,它只是一個通過添加GUI表單和註釋工具來擴展Ant javac任務的Ant任務。 IDEA Community Edition git存儲庫中提供了此任務的源代碼。 – CrazyCoder

+1

@CrazyCoder在我想測試空指針行爲的地方,是否有辦法關閉單元測試的處理? IE瀏覽器。 '@ org.junit.Test(expected = NullPointerException.class)'tests? – Martin

0

您可以在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 Unit Tests

相關問題