2011-08-10 7 views
9

की रन-टाइम प्रोसेसिंग को जोड़ने के लिए मैं आश्चर्यचकित था कि IntelliJ वास्तव में रनटाइम आईडीईए के भीतर @NotNull का सत्यापन करता है जब यूनिट परीक्षण चलाता/डिबग करता है। क्या मेरे लिए मेरे मैवेन बिल्ड में यह वही सुविधा जोड़ना संभव है? (मैं की आवश्यकता होती है क्या जार/JVM सेटिंग्स करते हैं?)@NotNull एनोटेशन

उत्तर

0

मैं AOP रास्ता तय करेंगे:

सबसे पहले आप एक javax.validation संगत सत्यापनकर्ता (Hibernate 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 का प्रयोग करें।

यदि आप केवल परीक्षण के लिए यह कार्यक्षमता चाहते हैं, तो आप प्रोफ़ाइल में पहलू-प्लगइन निष्पादन डाल सकते हैं।

4

आईडीईए इस तरह के सत्यापन जोड़ने के लिए बाइटकोड के उपकरण की अपनी विधि का उपयोग कर रहा है। कमांड लाइन के लिए हम javac2 चींटी कार्य प्रदान करते हैं जो उपकरण (मानक जावैक कार्य को बढ़ाता है) प्रदान करता है। यदि आप आईडीईए से चींटी निर्माण उत्पन्न करते हैं, तो आपके पास javac2 का उपयोग करने का विकल्प होगा।

We don't provide similar Maven plug-in yet, लेकिन there is third-party version जो आपके लिए काम कर सकता है (हालांकि, यह थोड़ा पुराना प्रतीत होता है)।

+0

पर एक नज़र डालें javac2.jar tools.jar के लिए एक स्थानापन्न है? – krosenvold

+0

नहीं, यह केवल एक चींटी कार्य है जो जीयूआई फॉर्म और एनोटेशन इंस्ट्रूमेंटेशन जोड़कर चींटी जावैक कार्य को बढ़ाता है। इस कार्य के लिए स्रोत कोड आईडीईए सामुदायिक संस्करण गिट भंडार में उपलब्ध है। – CrazyCoder

+1

@CrazyCoder क्या यूनिट परीक्षणों के लिए प्रसंस्करण बंद करने का कोई तरीका है जहां मैं शून्य सूचक व्यवहार का परीक्षण करना चाहता हूं? अर्थात। '@ org.junit.Test (अपेक्षित = NullPointerException.class) 'परीक्षण? – Martin

0

आप अपने जुनीट परीक्षणों में एनोटेशन सत्यापन कर सकते हैं।

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

संबंधित मुद्दे