2013-06-21 10 views
5

जावा कोड के हिस्से के रूप में कल कुछ कार्य करने की आवश्यकता जुनीट में की जानी चाहिए। जुनीट परीक्षण स्थिरता में समय और दिनांक निर्धारित करना

  • task3 यह कर कल - - तो यह क्या होगा
  • तो जैसा कि आवश्यकता के अनुसार मैं करने की जरूरत किया

  • task2 -

    • task1:

      उदाहरण के लिए वहाँ 3 कार्य दिए गए हैं जावा में कल के रूप में आज की तारीख सेट करें।

  • +0

    क्या आप हमें अपने यूनिट परीक्षण का स्रोत दिखा सकते हैं? – tbsalling

    +0

    मुझे किसी भी फ्रेमवर्क का उपयोग करने की आवश्यकता नहीं है। मेरे पास केवल तीन कार्य हैं जैसे तीन विधि कॉल। F1() -> f2() -> f3()। एफ 2 कल किया जा सकता है और फिर परिणामस्वरूप एफ 3 कहा जाएगा। – hi5

    +0

    यह भी देखें http://stackoverflow.com/questions/10652097/simulating-the-passing-of-time-in-unittesting – Raedwald

    उत्तर

    5

    कुंजी "निर्भरता के रूप में आपको वर्तमान समय दे सकता है" के विचार को निकालने की कुंजी है। (प्रासंगिक समय क्षेत्र के साथ।)

    तो new Date() या System.currentTimeMillis() का उपयोग करने के बजाय आप Clock अमूर्तता का उपयोग करते हैं। उत्पादन कोड के लिए आप इसका एक उदाहरण इंजेक्ट करते हैं जो अंतर्निहित सिस्टम घड़ी का उपयोग करता है, लेकिन परीक्षण के लिए आप एक नकली घड़ी का उपयोग करते हैं जिसे आप स्पष्ट रूप से नियंत्रित कर सकते हैं, जिससे आप जो कुछ भी करना चाहते हैं उसे वापस कर सकें।

    (यह वास्तव में बिल्कुल स्पष्ट नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं, ईमानदार होना -। लेकिन इस दृष्टिकोण समय परीक्षण योग्य बनाने के लिए अपने मानक दृष्टिकोण है)

    9

    आपकी समस्या की जड़ यह है कि सिस्टम घड़ी है (आपको new Date() में समय क्या देता है) आपको वह समय नहीं दे रहा है जिसकी आपको आवश्यकता है।

    आप इस समस्या से संकेत प्राप्त कर सकते हैं कि वे एक स्तर का संकेत दे सकें। अपना कोड सीधे जावा एपीआई से पूछने के बजाय वर्तमान समय क्या है, आपके पास कोड है Clock ऑब्जेक्ट का समय क्या है। वास्तविक कार्यक्रम में आपके Clock कार्यान्वयन सिस्टम घड़ी का उपयोग करता है। आपके यूनिट परीक्षणों के लिए आप FakeClock का उपयोग करते हैं, जो कहता है कि आप जो भी समय चाहते हैं। निर्भरता इंजेक्शन का उपयोग करके आप अपने कोड को Clock का उपयोग करने के लिए बताएं। आपको Clock इंटरफ़ेस (या सार आधार वर्ग) और इसके ठोस कार्यान्वयन स्वयं लिखना है।

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

    मैं उस समय कुछ कोड पर काम कर रहा हूं जो समय संवेदनशील है। DateSupplier & & DateController: मेरी घड़ी इंटरफ़ेस बस

    public interface Clock { 
        long getCurrentTime(); 
    } 
    
    3

    GitHub पर निम्नलिखित कोड पर विचार करें है। DateSupplier में एक स्थिर विधि है जो वर्तमान तारीख को लौटाती है। DateController आपको एक परीक्षण वातावरण में DateSupplier द्वारा लौटाए गए दिनांक मान का उपयोग करने की अनुमति देता है। यह JUnit Rule है और अपने आप बाद में साफ हो जाता है।

    यह अन्य दो उत्तरों से Clock विचारों का एक ठोस कार्यान्वयन है। मैं अपनी परियोजनाओं में एक साल या उससे भी ज्यादा सफलता के साथ इसका उपयोग कर रहा हूं। किसी भी समय मेरे पास कोड है जो new Date() करेगा, मैं इसके बजाय DateSupplier.getCurrentDate() पर कॉल करता हूं।

    2

    Joda Time का उपयोग करने पर विचार करें, जो जावा की तिथि और समय कक्षाओं के प्रतिस्थापन है।यह

    DateTimeUtils.setCurrentMillisFixed(long millis); 
    

    जो आपके परीक्षणों में उपयोग किया जा सकता है।

    +0

    +1। मैं एक समय सीमित परीक्षण संस्करण स्थापित कर रहा हूं और समय के बारे में SO उत्तरों में जोडा समय देख रहा हूं। यह वह मुद्दा था जिसने इसे जोदा समय में सार्थक रूप से बदल दिया। इसे स्थापित करने में मुझे एक घंटे से भी कम समय लगे, इसका उपयोग करने के लिए मेरा कोड बदलें, और इस सुझाव के साथ मेरा परीक्षण स्थापित करें। –

    +0

    कॉल 'DateTimeUtils.setCurrentMillisFixed (...) 'होना चाहिए। यह एक विशिष्ट दिनांक समय निर्धारित करने के लिए कॉल है। 'DateTimeUtils.setCurrentMillisSystem()' (पैरामीटर रहित) वर्तमान सिस्टम समय का उपयोग करने के लिए डेटटाइम सेट करता है। Http://www.joda.org/joda-time/apidocs/index.html देखें –

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