2013-07-19 13 views
11

मैं अपनी कक्षा में मॉकिटो अन्य कक्षाओं के साथ कैसे नकल कर सकता हूं जो परीक्षण में है?परीक्षण के तहत कक्षा में नकली कक्षा

उदाहरण के लिए:

MyClass.java

class MyClass { 
    public boolean performAnything() { 
     AnythingPerformerClass clazz = new AnythingPerformerClass(); 
     return clazz.doSomething();   
    } 
} 

AnythingPerformerClass.java

class AnythingPerformerClass { 
    public boolean doSomething() { 
     //very very complex logic 
     return result; 
    } 
} 

और परीक्षण:

@Test 
public void testPerformAnything() throws Exception { 
    MyClass clazz = new MyClass(); 
    Assert.assertTrue(clazz.performAnything()); 
} 

मैं धोखा दे सकते हैं AnythingPerformerClass च या AnythingPerformerClass से अनावश्यक तर्क को छोड़कर? क्या मैं सरल वापसी true या false के लिए doSomething() विधि ओवरराइड कर सकता हूं?

मैं मॉकिटो क्यों निर्दिष्ट करता हूं, क्योंकि मुझे रोबॉलेक्ट्रिक के साथ एंड्रॉइड परीक्षण के लिए इसकी आवश्यकता है।

+0

आप प्रत्येक विधि कॉल के लिए कक्षा के एक उदाहरण को तत्काल क्यों करते हैं? यह गंभीरता से अधिक दिखता है – fge

उत्तर

12

आप MyClass तो refactor सकता है कि यह dependency injection उपयोग करता है। इसके बजाय यह एक AnythingPerformerClass उदाहरण बनाने के होने के तुम इतनी तरह MyClass के निर्माता के लिए कक्षा का एक उदाहरण प्रेषित कर सकता है:

class MyClass { 

    private final AnythingPerformerClass clazz; 

    MyClass(AnythingPerformerClass clazz) { 
     this.clazz = clazz; 
    } 

    public boolean performAnything() {   
    return clazz.doSomething();   
    } 
} 

फिर आप इकाई परीक्षण में नकली कार्यान्वयन में पारित कर सकते हैं

@Test 
public void testPerformAnything() throws Exception { 
    AnythingPerformerClass mockedPerformer = Mockito.mock(AnythingPerformerClass.class); 
    MyClass clazz = new MyClass(mockedPerformer); 
    ... 
} 

वैकल्पिक रूप से, यदि आपके AnythingPerformerClass में राज्य है तो आप कन्स्ट्रक्टर को AnythingPerformerClassBuilder पास कर सकते हैं।

+0

[मॉकिटो डॉक्स] (http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#2) के अनुसार, एक प्राचीन 'बूलियन' के लिए डिफ़ॉल्ट वापसी मान होगा 'झूठा', तो यह परीक्षण मामला विफल रहता है। – mthmulders

+0

ठीक है, मैंने उस चरण को छोड़ दिया जहां विधि कॉल का मज़ाक उड़ाया गया था। ओपी का कहना है, "क्या मैं सरल वापसी या गलत वापसी के लिए कुछ() विधि को ओवरराइड कर सकता हूं?" तो मुझे नहीं लगता कि मुझे कोड को बाधित करना चाहिए। – cyon

1

आप मॉकिटो में क्या लौट सकते हैं सेट कर सकते हैं।

when(mock.method()).thenReturn(someValue) 
3

यह वर्तमान में (दोनों घोषणा और AnythingPerformerClass एक विधि के अंदर की इन्स्टेन्शियशन है, यह संभव नहीं है केवल Mockito का उपयोग कर AnythingPerformerClass उपहास करने के लिए है।

संभव हो तो, दोनों घोषणा और AnythingPerformerClass की इन्स्टेन्शियशन के लिए कदम श्रेणी स्तर के लिए: प्रकार AnythingPerformerClass का एक उदाहरण चर घोषित करने और यह निर्माता द्वारा instantiated है

इस तरह, आप और अधिक आसानी से परीक्षण के दौरान AnythingPerformerClass की एक नकली इंजेक्षन सकता है, और अपने व्यवहार निर्दिष्ट पूर्व के लिए।। पर्याप्त:

when(anythingPerformerClassMock.doSomething()).thenReturn(true); 

या त्रुटि हैंडलिंग परीक्षण करने के लिए:

when(anythingPerformerClassMock.doSomething()).thenTrow(new NullPointerException()); 
संबंधित मुद्दे