2012-03-01 7 views
11

में एनोटेशन-आधारित सत्यापन है, जब फॉर्म बीन के लिए एनोटेशन आधारित सत्यापन का उपयोग करते हैं, तो यह सुनिश्चित करने के लिए कि सही सत्यापन एनोटेशन निर्दिष्ट किए गए हैं, यूनिट-परीक्षण उन बीन्स के लिए सबसे अच्छा अभ्यास क्या है प्रत्येक क्षेत्र के लिए?यूनिट परीक्षण फॉर्म बीन्स के लिए अच्छे पैटर्न, जिनमें स्प्रिंग एमवीसी

उदाहरण के लिए

, यदि आपके पास:

public class MyForm { 
    @NotNull 
    private String name; 
} 

की पुष्टि है कि @NotNull इसे करने के लिए लागू किया जाता है सबसे अच्छा तरीका क्या है?

एक स्पष्ट तरीका है एक वैधकर्ता बनाना, उस पर एक नल फेंकना और यह असफल होने की उम्मीद है। लेकिन मेरे विचार में यह सबसे अच्छा तरीका नहीं है क्योंकि आप ढांचे पर भरोसा करने के बजाय @NotNull के व्यवहार और कार्यान्वयन का परीक्षण करेंगे।

आदर्श रूप में मैं प्रतिबिंब या उपयोगिता का उपयोग करना चाहता हूं जो मुझे केवल @NotNull (और किसी अन्य) सत्यापन को किसी दिए गए फ़ील्ड पर लागू किया जाता है, मान्यताओं में विफल होने वाले मानों के विभिन्न संयोजन भेजने के बजाय ।

क्या ऐसा करने का एक शानदार तरीका है, या मैं सामान्य रूप से सही रास्ते पर हूं?

उत्तर

4

आप अपने बीन्स के लिए यूनिट परीक्षण भी लिख सकते हैं जिन्हें सत्यापनकर्ता कारखाने का उपयोग करके जेएसआर 303 में एनोटेट किया गया है। उदाहरण देखें: http://musingsofaprogrammingaddict.blogspot.com/2009/02/using-bean-validation-with-spring.html

+0

धन्यवाद। पोस्ट में मुख्य लेख वास्तव में जिस तरह से मैं बचाना चाहता हूं वह कर रहा हूं। हालांकि उस पोस्ट (गुन्नार से) पर एक टिप्पणी है जो मुझे उम्मीद कर रही थी - एनोटेशन के व्यवहार की बजाय एनोटेशन की जांच करना। –

+2

पृष्ठ ऑफ़लाइन होने पर जानकारी खोने से रोकने के लिए अपने उत्तर के हिस्से के रूप में लिंक किए गए आलेख के मंडप भागों को जोड़ें। – CSchulz

5

दो बातें आप पर विचार करना चाहिए:

अपने तीसरे पक्ष के पुस्तकालयों/चौखटे का परीक्षण न करें।

आपको उन पर भरोसा करना चाहिए, उन्हें पहले से ही उनके रखरखाव और आसपास के समुदाय के उपयोग से परीक्षण किया जाना चाहिए। आप उनका परीक्षण नहीं करते हैं, बल्कि का आकलन करें। यह सुनिश्चित करने के लिए कि वे आपकी जरूरतों को पूरा करते हैं और जोखिम को कम करते हैं।

परीक्षण व्यवहार वास्तव में क्या मायने रखता है!

अनुप्रयोगों के विशाल बहुमत में वहाँ असली यूनिट परीक्षण के लिए थोड़ा जगह के रूप में व्यापार तर्क है या तो छोटे आवेदन के कई मॉड्यूल भर में बड़े पैमाने पर हो रहा है। तो आपको यूनिट परीक्षण की तुलना में समान प्राथमिकता के साथ एकीकरण परीक्षण पर विचार करना चाहिए। और यह एक व्यवहार दृष्टिकोण का उपयोग करके आसानी से कब्जा कर लिया जाता है।

तो, अपने प्रश्न का उत्तर देने के लिए, आपको एक फॉर्म बीन का परीक्षण करने की कोशिश नहीं करनी चाहिए। यह सिर्फ एक परिवहन वस्तु है। आपको परीक्षण करना चाहिए कि रिसीवर उस फॉर्म के साथ कैसे प्रतिक्रिया करता है, और सामान्य मामला और किनारे के मामलों दोनों की जांच करें।

+2

मैं तीसरे पक्ष के पुस्तकालयों का परीक्षण नहीं के साथ सहमत की तरह कुछ किया जाना चाहिए, हालांकि परीक्षण आपके विन्यास परीक्षण व्यवहार के रूप में के रूप में महत्वपूर्ण है। –

+0

हां, यह एक अच्छा मुद्दा है और मैं इसके साथ सहमत हूं। हालांकि मुझे लगता है (frant.hartm कहता है) कि कॉन्फ़िगरेशन का परीक्षण करने के लिए एक कमरा है। बाकी सब कुछ (यानी वास्तविक सत्यापन) के पास बीन से सीधे कुछ लेना देना नहीं है और यहां परीक्षण नहीं किया जाना चाहिए। –

+1

+1 'तो आपको यूनिट परीक्षण की तुलना में समान प्राथमिकता के साथ एकीकरण परीक्षण पर विचार करना चाहिए।' – artbristol

2

हम अपनी प्रस्तुति परत और वसंत कंटेनर के बीच एकीकरण परीक्षण के हिस्से के रूप में बीन गुणों पर एनोटेशन का परीक्षण करते हैं।

हम क्या करते हैं नकली MockPortletContext, डिस्पैचर पोर्टलेट और मॉकरक्वेट्स (ये कक्षाएं स्प्रिंग-टेस्ट लाइब्रेरी का हिस्सा हैं), अनुरोधों को भरें ताकि वे वास्तविक रूप की तरह सबमिट हो जाएं और फिर प्रेषक पोर्ट को कॉल करें। (हमारे पास पोर्टल पर्यावरण है लेकिन इससे कोई फर्क नहीं पड़ता)

फिर आप जांच सकते हैं कि आपके बैकएंड को उचित रूप से कहा जाता है या प्रतिक्रिया में अपेक्षित सत्यापन त्रुटियों के साथ बाध्यकारी परिणाम होता है जो आपको चाहिए ..

2

आप इसे आसानी से परीक्षण कर सकते हैं।

मान लें कि आप हाइबरनेट वैलिडेटर का उपयोग कर रहे हैं। कमोबेश, यह इस

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; 

private LocalValidatorFactoryBean localValidatorFactory; 


@Before 
public void setup() { 
    localValidatorFactory = new LocalValidatorFactoryBean(); 
    localValidatorFactory.setProviderClass(HibernateValidator.class); 
    localValidatorFactory.afterPropertiesSet(); 
} 

    @Test 
    public void testNullValidationError() { 
     final MyForm myForm= new MyForm(); 
     myForm.setName(null); 
     Set<ConstraintViolation<MyForm >> constraintViolations =  localValidatorFactory.validate(myForm); 
     Assert.assertTrue("Your error message", constraintViolations.notNull == null); 
    } 
+0

नहीं, मूल पोस्ट और अनुवर्ती अनुवर्ती में समझाया गया है, जैसा कि मैं वास्तव में बीन के लिए यूनिट परीक्षण में टालना चाहता हूं। –

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