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

यह परीक्षण किया जाने वाला कोड है। ध्यान दें कि nonCashIncludedPaymentPlanActive हमेशा सत्य (मॉक्ड) होता है।

    List<DebtAccountTransaction> debtAccountTransactionList = null;

    boolean nonCashIncludedPaymentPlanActive = balancingPlanService.checkNonCashIncludedPaymentPlanParameter(debtAccountId);


    if (nonCashIncludedPaymentPlanActive) {
        debtAccountTransactionList = debtAccountTransactionDao
                .getDebtAccountTransactionListByDebtAccountIdListWithCN(baseDebtIdAccountList, null);
    } 
    if (debtAccountTransactionList.isEmpty()) {
        throw new SfcException("DISPLAY.PAYMENT_PLAN_WITH_NO_BALANCE_SERVICE_FILE_CLOSED");
    }

यह वह कथन है जो एक सूची लौटाता रहता है जिसे मैंने मॉकिटो में मज़ाक उड़ाया है और इसमें एक आइटम जोड़ा है और यहाँ यह एक खाली सूची देता है।

debtAccountTransactionList = debtAccountTransactionDao
                .getDebtAccountTransactionListByDebtAccountIdListWithCN(baseDebtIdAccountList, null);

जो तब निश्चित रूप से इस रेखा की चपेट में आ जाता है

if (debtAccountTransactionList.isEmpty()) {
        throw new SfcException("DISPLAY.PAYMENT_PLAN_WITH_NO_BALANCE_SERVICE_FILE_CLOSED");
    }

इस प्रकार निष्पादन के इस मार्ग से बचने के लिए मैंने मॉकिटो में निम्नलिखित कार्य किया है:

when(debtAccountTransactionDao.getDebtAccountTransactionListByDebtAccountIdListWithCN(baseDebtIdAccountList, null)).thenReturn(
            debtAccountTransactionList);

और ऋणअकाउंटट्रान्सएक्शनलिस्ट की घोषणा है:

DebtAccountTransaction debtAccountTransaction = spy(DebtAccountTransaction.class);
    debtAccountTransaction.setId(2L);


    List<DebtAccountTransaction> debtAccountTransactionList = new ArrayList<DebtAccountTransaction>();
    debtAccountTransactionList.add(debtAccountTransaction);

मैंने एक सूची का मज़ाक उड़ाने की कोशिश की, विभिन्न तर्कों को पकड़ने की कोशिश की, लेकिन कुछ भी काम नहीं करता है। जब मैं इसे डीबग करता हूं, तो मॉकिटो debtAccountTransactionList भरता है, लेकिन एक खाली सूची के साथ, इस प्रकार यह विफल हो जाता है।

मैं कैसे सुनिश्चित कर सकता हूं कि मॉकिटो एक गैर-खाली गैर-शून्य सूची भेजता है, ताकि यह isEmpty() चेक को बायपास कर सके।

2
AbuBakar Khan 25 सितंबर 2018, 15:00
समस्या नकली निर्माण/व्यवहार पंजीकरण है। यह आपके द्वारा विधि में डाले गए से मेल नहीं खाता है और इसलिए एक खाली सूची को वापस करने के डिफ़ॉल्ट व्यवहार पर वापस आ जाता है।
 – 
M. Deinum
25 सितंबर 2018, 15:05

3 जवाब

सबसे बढ़िया उत्तर

समस्या नकली निर्माण/व्यवहार पंजीकरण है। यह आपके द्वारा विधि में डाले गए से मेल नहीं खाता है और इसलिए एक खाली सूची को वापस करने के डिफ़ॉल्ट व्यवहार पर वापस आ जाता है।

जैसा कि M द्वारा बताया गया है। डीनम

इस प्रकार मॉकिटो द्वारा तर्क की स्वीकृति में एक समस्या थी और यह मेरे स्टबिंग को अनदेखा कर देगा और फिर डिफ़ॉल्ट रूप से एक खाली सूची लौटाएगा।

मैंने यह सुनिश्चित करके इसे ठीक किया है कि ऑब्जेक्ट जो baseDebtIdAccountList है, फ़ंक्शन को पास किया गया है कब(debtAccountTransactionDao.getDebtAccountTransactionListByDebtAccountIdListWithCN(baseDebtIdAccountList, null)).thenReturn( dateAccountTransactionList) बाकी कोड में बिल्कुल वैसा ही है। इस प्रकार तर्कों में एक बेमेल था और मॉकिटो ने एक खाली सूची का उपयोग करने के डिफ़ॉल्ट तरीके का उपयोग किया।

2
AbuBakar Khan 25 सितंबर 2018, 15:36

क्या आपने कोड के किसी भी स्थान पर कुछ ऐसा रखा है:

debtAccountTransactionDao = Mockito.mock(NameOfTheClassOfThisDebtAccountObject.class);

?

विधि getDebtAccountTransactionListByDebtAccountIdListWithCN को कॉल करने से पहले आपको कुछ इस तरह रखना चाहिए, इसलिए यह जानता है कि इसे नकली व्यवहार का उपयोग करना चाहिए, न कि विधि के सामान्य व्यवहार (जिसे एक खाली सूची वापस किया जा सकता है)।

1
tbsalling 25 सितंबर 2018, 15:31

परीक्षण लिखने में अंगूठे का एक अच्छा नियम, विशेष रूप से मॉकिटो जैसे नकली पुस्तकालय के साथ: सत्यापन के साथ स्टबिंग को भ्रमित न करें। स्टबिंग (when) आपके सिस्टम को परीक्षण (SUT) के तहत वांछित स्थिति में लाने के बारे में है, नहीं के बारे में जोर करने के बारे में कि SUT कैसे व्यवहार करता है।

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

परिणामस्वरूप, आमतौर पर स्टबिंग (when) के लिए अपने मैचर्स को जितना संभव हो उतना चौड़ा बनाना सबसे अच्छा है, क्योंकि स्टबिंग का लक्ष्य सिर्फ यह सुनिश्चित करना है कि आप सही टेस्ट केस में आते हैं। उदाहरण के लिए, आप अपने when() कॉल में any() जैसे मैचर्स का उपयोग कर सकते हैं और अक्सर करना चाहिए। यदि आपने ऐसा किया है, तो आप यहां होने वाली समस्या को दरकिनार कर देंगे।

यदि आप उन मानों के बारे में दावा करना चाहते हैं जो एसयूटी वास्तव में तर्क के रूप में उपयोग करते हैं, तो इसे verify के साथ करें, या संभवतः मूल्य को कैप्चर करके और इसके बारे में अतिरिक्त दावा करके सीधे करें।

6
Daniel Pryden 25 सितंबर 2018, 15:37