2011-09-28 11 views
9

मैं खुद को मॉकिटो सिखाने की कोशिश कर रहा हूं।मॉकिटो "कब" समस्या

निम्न विधि, hasInventory(), जो वास्तव में सोच के मेरे रास्ते में नहीं भागना चाहिए पर विचार करें, लेकिन सच या झूठी के रूप में मैं गिलहरी पिंजरे वापस जाने के लिए अपने परीक्षण की स्थापना के लिये। कक्षा वेयरहाउस मेरी "मॉक-निर्भरता" है।

public class Warehouse implements IWarehouse 
{ 
    private Map< String, Integer > inventory; 

    public Warehouse() 
    { 
    this.inventory = new HashMap< String, Integer >(); 
    } 

    public final boolean hasInventory(String itemname, int quantity) 
     throws InventoryDoesNotExistException 
    { 
    if(inventory == null) 
     throw new InventoryDoesNotExistException(); 

    if(!inventory.containsKey(itemname)) 
     return false; 

    int current = (inventory.containsKey(itemname)) ? inventory.get(itemname) : 0; 

    return(current >= quantity); 
    } 
    ... 

JUnit परीक्षण कोड में, पहली जब() क्योंकि यह सचमुच विधि कॉल (यह क्रियान्वित करने) और, सूची नहीं के बराबर किया जा रहा है (ऊपर देखें) की व्याख्या एक अपवाद फेंकता है, InventoryDoesNotExistException है फेंक दिया। मॉक-निर्भरता वर्ग में अन्य विधियां भी हैं, जैसे जोड़ें() और हटाएं()

@RunWith(MockitoJUnitRunner.class) 
public class OrderInteractionTest 
{ 
    private static final String TALISKER = "Talisker"; 
    private Order systemUnderTest = null; 

    @Mock 
    private Warehouse mockedDependency = null; 

    @Before 
    public void init() 
    { 
    //MockitoAnnotations.initMocks(this); 
    //mockedDependency = mock(Warehouse.class); 
    this.systemUnderTest = new Order(TALISKER, 50); 
    } 

    @Test 
    public void testFillingRemovesInventoryIfInStock() 
    { 
    try 
    { 
     doNothing().doThrow(new RuntimeException()).when(mockedDependency).add(anyString(), anyInt()); 
     doNothing().doThrow(new RuntimeException()).when(mockedDependency).remove(anyString(), anyInt()); 
     when(mockedDependency.hasInventory(anyString(), anyInt())).thenReturn(true); 
     when(mockedDependency.getInventory(anyString())).thenReturn(50); 

मैं इसे समझते हैं, द्वारा जब() विधि, मैं Mockito ठीक (hasInventory फोन नहीं करने के लिए), लेकिन सिर्फ सच वापस जाने के लिए बजाय जब भी यह मैं परीक्षण के रूप में कहा जाता है पूछ रहा हूँ के रूप में कक्षा ("systemUnderTest")। क्या कोई मुझे इस बिंदु से पहले (या मेरे दिमाग में कुछ समझ प्राप्त करने में मदद कर सकता है)?

मैं mockito सभी-1.8.5.jar जोड़ने रहा हूँ और JUnit 4.

सब जो इस पढ़ने के लिए प्रचुर धन्यवाद।

रस

उत्तर

10

Mockito final वर्ग या तरीकों नकली नहीं कर सकते। hasInventory विधि से final संशोधक को निकालने का प्रयास करें। या बेहतर अभी तक, Warehouse कक्षा का नकल न करें, इसके बजाय IWarehouse इंटरफ़ेस का नकल करें, जिनकी विधियां final नहीं हो सकती हैं, और संभावित रूप से Order द्वारा उपयोग किए जाने वाले लोगों को परिभाषित करती हैं।

सामान्य रूप से, यह इंटरफेस का मज़ाक करना बेहतर है, लेकिन यह अनिवार्य नहीं है।

final नकली करने में सक्षम नहीं है Mockito FAQ में कक्षाओं या विधियों का संक्षेप में उल्लेख किया गया है, यह रनटाइम क्लास पीढ़ी तकनीक के कारण मॉक्स बनाने के लिए उपयोग किया जाता है।

+0

हा! हाँ, यह समस्या है। असल में, मैंने आज पहले इस बारे में कुछ पढ़ा, लेकिन मैंने कनेक्शन नहीं बनाया। अन्य ट्यूटोरियल की नकल में, मैंने आईवेयरहाउस का मज़ाक उड़ाया था और यह काम कर रहा था, इसलिए मैंने सोचा कि मैं केवल इंटरफेस का मज़ाक उड़ा सकता हूं (मैं कुछ हफ्ते पहले किसी से बात कर रहा था जिसने मुझे बताया कि मैं साधारण कक्षाओं का मज़ाक उड़ा सकता हूं, इसलिए मैंने कोशिश नहीं की थी इंटरफ़ेस का मज़ाक उड़ाते हुए मैंने कई वास्तविक जीवन परिदृश्यों में पाया, मेरे पास इंटरफ़ेस भी नहीं होगा)। लेकिन यह सही जवाब है! इसके लिए आपको बहुत धन्यवाद। –

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