2013-08-20 14 views
13

कॉल करता है मैं विरासत कोड पर थोड़ा सा काम कर रहा हूं। मैं एक परीक्षण है कि NullPointerException को पकड़ने के लिए माना जाता है लिखा हैमॉकिटो जब()। फिर रीटर्न विधि को अनावश्यक रूप से

@Test(expected=NullPointerException.class) 
public void checkXRequirement_NullProduct_AddAction_ShouldThrowNullPointerException() throws CustomException { 
    Site site = mock(Site.class); 
    Product product = null; 
    when(BasketHelper.getAction(request)).thenReturn(0); 
    when(BasketHelper.getActionProduct(site, request)).thenReturn(product); 
    BasketHelper.requiresX(request, site); 

} 

प्रासंगिक तरीके और चर (यह शून्य वस्तु से एक विधि कॉल करने के प्रयास कर रहा है के लिए):

public static final int ACTION_ADD = 0; 
public static final int ACTION_DELETE = 1; 

protected static int getAction(HttpServletRequest a_request) { 
    String sBuyProduct = a_request.getParameter(ATTRIBUTE_NAME_BUY_PRODUCT); 
    String sBuyProduct = a_request.getParameter(ATTRIBUTE_NAME_BUY_PRODUCT); 

    if (sBuyProduct != null) iAction = ACTION_ADD; 
    else (sDelProduct != null) iAction = ACTION_DELETE; 

    return iBasketAction 
} 

protected static Product getActionProduct(Site a_site, HttpServletRequest a_request) { 

    String sBuyProduct = a_request.getParameter(ATTRIBUTE_NAME_BUY_PRODUCT); 
    String sDelProduct = a_request.getParameter(ATTRIBUTE_NAME_DEL_PRODUCT); 
    String sProduct = null; 

    switch (getBasketAction(a_request)) { 
     case BASKET_ACTION_ADD: 
     sProduct = sBuyProduct; 
    break; 
     case BASKET_ACTION_DELETE: 
     sProduct = sDelProduct; 
    break; 
    } 

    int iProductId; 
    try { 
     iProductId = Integer.parseInt(sProduct); 
    } catch (NumberFormatException nbrEx) { 
     return null; 
    } 

    Product prod = getProductById(iProductId); 

    if (prod.isMasterProduct()) { 
     prod = getChildProduct(prod, a_site, a_request); 
    } 

    return prod; 
} 


public static boolean requiresX(HttpServletRequest request, Site site) throws CustomException { 
    try{ 
    if (getAction(request) == ACTION_ADD) { 
    Product prod = getActionProduct(site, request); 
    return prod.getType().isRequiredX(); 
    } 
    } catch(NullPointerException exception) { 
    log.error("Error Message", exception); 
    } 
    return false; 
} 

चलने के JUnit परिणाम

java.lang.Exception: Unexpected exception, expected<java.lang.NullPointerException> but was<org.mockito.exceptions.misusing.WrongTypeOfReturnValue> 
Caused by: org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Integer cannot be returned by getParameter() 
getParameter() should return String# 

मैं नादुस्र्स्ती से समझना है कैसे जब() thenReturn वह काम करने के लिए माना जाता है। परीक्षण के स्टैक ट्रेस के साथ एक विफलता है फिर? मैं सिर्फ 0 को वापस करने के लिए एक्शन प्राप्त करना चाहता हूं और जब भी इसे कॉल किया जा रहा है तो उसे वापस करने के लिए एक्शन प्रोडक्ट प्राप्त करें। स्पष्ट रूप से प्राप्त करें पैरामीटर() कहा जाता है और मुझे नहीं पता कि वास्तव में क्यों।

+0

क्या आप 'getProduct() 'दिखा सकते हैं? –

+0

अन्य समाचारों में .... मैं देख सकता हूं कि आप किसी समस्या को दोहराने के लिए इस तरह के परीक्षण क्यों लिखेंगे। हालांकि, यहां वास्तविक परीक्षण यह सत्यापित करना चाहिए कि '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' जब तक आपका विरासत कोड कोड प्रवाह को नियंत्रित करने के लिए नाप का उपयोग नहीं कर रहा हो?किस मामले में - बाहर भी चीर। – OceanLife

+0

मुझे लगता है कि आप सही हैं। Requx विधि में स्थिति बदलना शायद एक अच्छा विचार है। –

उत्तर

13

मॉकिटो स्थिर विधि का नकल नहीं कर सकता है। आपका जब जांच मान्य नहीं है:

when(BasketHelper.getAction(request)).thenReturn(0); 
    when(BasketHelper.getActionProduct(site, request)).thenReturn(product); 

एक और कारण है कि हम स्थिर पद्धति के उपयोग को कम करना चाहते के रूप में यह उपहास करने के लिए कठिन है है।

यदि आपकी कक्षा इस तरह रहती है तो व्यवहार को नकल करने का कोई आसान तरीका नहीं है। हालांकि यदि आप अपना डिज़ाइन बदलना चाहते हैं और दोनों विधियों को गैर-स्थैतिक बनाना चाहते हैं। "कब" का उपयोग करने का सही तरीका मॉक ऑब्जेक्ट पर चेक लागू करना है। उदाहरण के लिए:

BasketHelper basketHelper = mock(BasketHelper.class); 
    when(basketHelper.getAction(request)).thenReturn(0); 
    when(basketHelper.getActionProduct(site, request)).thenReturn(product); 

लेकिन एक बार फिर से, यह केवल काम आप फिर से तैयार किया गया है अपने वर्ग के getAction और getProduct विधि गैर स्थिर होने के लिए है।

मुझे याद है कि कुछ अन्य परीक्षण ढांचे हैं जो स्थिर विधि का मज़ाक उड़ाते हैं।

+2

मुझे लगता है कि पावरमैक स्थैतिक तरीकों का मज़ाक उड़ाता है। शायद मुझे इसमें देखना चाहिए। धन्यवाद –

+0

ऐसा लगता है कि यह है :-) इसके साथ शुभकामनाएँ। – KKKCoder

+0

आप पावरमोक में देख सकते हैं। या आप स्थैतिक तरीकों के उपयोग से बचने के लिए अपने कोड को दोबारा कर सकते हैं। मैं बाद वाले की सिफारिश करेंगे। –

1

आप पावरमैक का उपयोग कर सकते हैं। प्रथम श्रेणी है जिस पर आप स्थिर तरीकों बुला रहे हैं की नकली बना सकते हैं -

mockStatic(BasketHelper.class); 

फिर अपने स्टब्स को परिभाषित -

when(BasketHelper.getAction(request)).thenReturn(0); 
when(BasketHelper.getActionProduct(site, request)).thenReturn(product); 
0

यह जो दूसरों एनोटेशन का उपयोग करने में मदद कर सकते हैं। यदि आप एनोटेशन का उपयोग कर रहे हैं, तो आपको @InjectMocks के बजाय @Mock का उपयोग करने की आवश्यकता हो सकती है। क्योंकि @InjectMocks एक साथ @Spy और @Mock के रूप में काम करता है। और @Spy हाल ही में निष्पादित विधियों का ट्रैक रखता है और आप महसूस कर सकते हैं कि गलत डेटा वापस/सबबेड किया गया है। इन दोनों की जाँच करें :

https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90

http://code.google.com/p/mockito/issues/detail?id=127

0

मैं इस सूत्र भर में भाग गया मेरी परीक्षणों में एक ही समस्या का समाधान करने का प्रयास करेगा।

यदि अन्य लोग इस समस्या को देखते हैं और यहां समाप्त होते हैं ... मेरे मामले में यह समर्थन वर्ग के लिए @PrepareForTest एनोटेशन का उपयोग नहीं कर रहा था।

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