2015-09-07 7 views
5

मुझे माफी मांगना शुरू करना है यदि मेरे द्वारा उपयोग की जाने वाली शर्तें गलत हैं। मैं केवल ऑटोमेशन कार्यों (ग्रैडल) के लिए ग्रोवी/जावा का उपयोग करता हूं, और मेरे पास उत्पादन ग्रेड सॉफ़्टवेयर देने के वर्षों का अनुभव नहीं है।स्पॉक - अपेक्षित मान वापस लौटने की उम्मीद नहीं है

तो, मेरे पास जो चुनौती है वह निम्नानुसार है: मेरे पास एक ऐसा स्पेस है जो रिटर्न स्ट्रिंग का परीक्षण करने की कोशिश कर रहा है (लगभग this के समान)।

def "pretty print returns correct string"() { 
    setup: 
    X509Certificate stubCert = Stub() 
    stubCert.getSubjectDN().toString() >> "Test" 

    when: 
    def output = X509CertificateUtils.prettyPrint(stubCert) 

    then: 
    output == "Subject: Test" 
} 

हालांकि, अंतर यह है कि मेरी विधि बाधा एक प्रधान ऑब्जेक्ट है, और उसके उस वस्तु के toString() है कि मैं वास्तव में ठूंठ करना चाहते हैं। मैंने सोचा कि मैं ठीक से ऊपर कर रहा था, लेकिन यह परिणाम मुझे उम्मीद नहीं देता है।

यहां मेरी सहायक कक्षा है।

import java.security.cert.X509Certificate 

class X509CertificateUtils { 

    static def prettyPrint(X509Certificate x509Certificate) { 
     return "Subject: ${x509Certificate.getSubjectDN()}" 
    } 
} 

मैं इस परीक्षण मैं निम्नलिखित त्रुटि मिलती है चलाते हैं:

output == "Subject: Test" 
|  | 
|  false 
|  38 differences (20% similarity) 
|  Subject: (Mock for)t(ype 'Principal' named 'dummy') 
|  Subject: (Tes------)t(-----------------------------) 
Subject: Mock for type 'Principal' named 'dummy' 

कोई मदद कृतज्ञता प्राप्त की जाएगी।

उत्तर

6

कुछ देर प्रतीक्षा ठूंठ बनाएँ:

X509Certificate stubCert = Stub() 
Principal princ = Stub() 
princ.toString() >> "Test" 
stubCert.getSubjectDN() >> princ 
+0

इसके लिए धन्यवाद। यह मेरी समस्या हल हो गई। मैं इस समाधान के करीब कुछ बार मिला। ब्याज से क्या आप जानते हैं कि विधियों को क्यों चुनौती नहीं मिली? – Sion

+0

चेनिंग स्टब्स को "कोड गंध" माना जाता है, आप इस संबंधित प्रश्न (और पहले उत्तर) में इसके बारे में अधिक पढ़ सकते हैं: http://stackoverflow.com/questions/7926891/mock-or-stub-for-chained-call । इसके अलावा, स्पॉक में स्टब्स के वर्तमान कार्यान्वयन को स्टब चेनिंग का समर्थन करने के लिए प्रोग्राम नहीं किया गया है, 'a.method() >> b' मूल रूप से एक वाक्य रचनात्मक चीनी है जो "विधि के लिए" ऑब्जेक्ट पर एक स्टब पंजीकृत करें "जैसे कुछ का अनुवाद करता है "लौटने के लिए" बी "'। आपके मामले में स्पॉक पहले 'stubCert.getSubjectDN() 'कहता है, तो परिणाम को एक स्टब होने की उम्मीद है, और इस लौटे ऑब्जेक्ट पर" toString "को पंजीकृत करने का प्रयास करता है। – bezmax

+0

उत्तर देने के लिए समय लेने के लिए धन्यवाद। बहुत सराहना की। – Sion

3

स्पॉक faking वस्तुओं के लिए कुछ दृष्टिकोण है। यहां current documentation है।

  • स्टब: एक नकली वस्तु है कि केवल रिटर्न क्या यह करने के लिए कहा जाता है; एक डिफ़ॉल्ट मूल्य अन्यथा (0, खाली, आदि)।
  • नकली: स्टब के समान, लेकिन यह ऑब्जेक्ट पर किए गए विधि कॉल की संख्या का परीक्षण भी कर सकता है।
  • जासूस: आपके ऑब्जेक्ट का सामान्य तत्कालता, मॉक्स श्रोताओं के रूप में लागू होते हैं जो वस्तु को कॉल को अवरुद्ध करते हैं। यह आपको सामान्य रूप से निर्दिष्ट विधियों के व्यवहार के साथ ऑब्जेक्ट का उपयोग करने देता है। अपने मजाकिया व्यवहार के दौरान किसी बिंदु पर मूल कोड को कॉल करना भी संभव है।

आप के लिए मेरे सवाल ... आप परीक्षण करने के लिए है कि prettyPrint() अकेले ठीक से काम कर रहा है प्रयास कर रहे हैं, कि SubjectDN.toString() ठीक से प्रिंट, या दोनों के संयोजन? मेरा सुझाव है कि आपका नकली एक वास्तविक विषय डीएन() ऑब्जेक्ट लौटाए जिसे आप तब भी परीक्षण करते हैं। ज्यादा काम नहीं, और अगर कुछ तोड़ता है तो आपके पास समस्या का जन्म कहां से बेहतर विचार है। मैक्स का समाधान आपके प्रश्न को हल करेगा; मैंने काफी करीब नहीं पढ़ा या अच्छे टेस्ट स्कोपिंग प्रथाओं का पालन नहीं किया। मैं अपने बाकी उत्तर को विचार के लिए भोजन के रूप में छोड़ दूंगा। यदि आप मेरे पैरामीटर के साथ मैक्स के स्टब दृष्टिकोण को मिश्रित करना चाहते हैं तो मैं सेटअप ब्लॉक में स्टब निर्माण के लिए ब्लॉक में वांछित स्ट्रिंग को पारित करने का सुझाव दूंगा।

यह विषय से बाहर निकलना शुरू हो रहा है, लेकिन यदि आपको एक से अधिक विषय डीएन परिदृश्य (शून्य, खाली, विभिन्न पूंजीकरण, संख्यात्मक, आदि) का परीक्षण करने की आवश्यकता है; आपको अपने परीक्षण को पैरामीटर करने में भी देखना चाहिए।

def "pretty print returns correct string"() { 
    setup: 
     X509Certificate stubCert = Mock() 
     stubCert.getSubjectDN() >> subject 

    expect: 
     subject.toString() == expectedToString 
     X509CertificateUtils.prettyPrint(stubCert) == expectedFormatted 

    where: 
     subject | expectedToString | expectedFormatted 
     new SubjectDN("") | ???? | "Subject: ????" 
     new SubjectDN(null) | ???? | "Subject: ????" 
     new SubjectDN("test") | "test" | "Subject: Test" 
     new SubjectDN("testing") | "testing" | "Subject: Testing" 
} 

यदि आपका बहुत मुद्रण वास्तव में prepending "विषय:" के रूप में सरल है कि आप शायद अपने expectedFormatted चर कंप्यूटिंग के साथ भाग मिल सकता है; लेकिन आपको वास्तव में परीक्षण को आसान बनाने के प्रयास में आपके द्वारा परीक्षण किए जा रहे कोड की नकल करने की आवश्यकता नहीं है।

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

@Unroll(iteration.testName) // Shows each iteration in its own result (in most IDEs) 
def "testing printing of a SubjectDN"() { 
    setup: 
     X509Certificate stubCert = Mock() 
     stubCert.getSubjectDN() >> iteration.subject 

    expect: 
     subject.toString() == iteration.expectedToString 
     X509CertificateUtils.prettyPrint(stubCert) == expectedFormatted 

    where: 
     iteration << [ 
      [testName: "Testing pretty printing a normal SubjectDN", 
      subject: new SubjectDN("test"), 
      expectedToString: "test"], 

      [testName: "Testing pretty printing a normal SubjectDN", 
      subject: new SubjectDN("testing 123"), 
      expectedToString: "testing 123"], 

      [testName: "Testing pretty printing a null SubjectDN", 
      subject: new SubjectDN(null), 
      expectedToString: ????] 

      // And so on...    
     ] 

     expectedFormatted = "Subject: ${iteration.expectedToString}" 
} 
+0

इस उत्तर के लिए धन्यवाद। मैंने ब्रेवटी के लिए मैक्स के समाधान के साथ जाने का विकल्प चुना, लेकिन मैंने आपके उत्तर से बहुत कुछ सीख लिया। :-) – Sion

+0

मुझे टिप्पणी करने के लिए पर्याप्त अंक अर्जित करने का मौका देने के लिए धन्यवाद! =) – ScientificMethod

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