2011-02-10 8 views
5

में पूर्व परिभाषित अपेक्षाओं को हटाकर मेरे पास एक ऑब्जेक्ट है कि मैं अपने परीक्षण वर्ग की @Before/setUp() विधि में जेएमॉकिट NonStrictExcpection() के साथ मजाक कर रहा हूं ताकि यह परीक्षण के तहत मेरी कक्षा के सामान्य निष्पादन के लिए अपेक्षित मूल्य लौटा सके।JMockit

यह मेरे परीक्षण परीक्षण विधियों के लिए एक परीक्षण के लिए ठीक है जहां मैं इस कोड के गैर-सामान्य संचालन का परीक्षण करना चाहता हूं।

मैंने परीक्षण विधि में एक नई उम्मीद बनाने की कोशिश की है, जो मुझे लगता है कि सेटअप विधि में अपेक्षाओं को ओवरराइड करेगा, लेकिन मुझे पता चला है कि सेटअप विधि में अपेक्षा नई उम्मीद को दबा रही है।

जब मैं सेटअप अपेक्षा को हटाता हूं, परीक्षण विधि अपेक्षित व्यवहार करती है (लेकिन मेरे सभी अन्य परीक्षण विफल होते हैं)।

मुझे अपनी टेस्ट क्लास को कैसे कोड करना चाहिए ताकि मैं न्यूनतम परीक्षण कोड के साथ प्रत्येक परीक्षण के लिए सही ढंग से परिभाषित उम्मीदों को निर्धारित कर सकूं? (मुझे पता है कि मैं प्रत्येक टेस्ट विधि, में उम्मीद कोड कॉपी/पेस्ट कर सकता हूं लेकिन अगर मैं सभी टिकाऊ नहीं हूं तो ऐसा नहीं करना चाहता हूं)।

मेरे परीक्षण कोड कुछ इस तरह दिखता है (ध्यान दें, इस sorta psuedocode है और संकलन नहीं है, लेकिन आप अंदाजा हो):

public class TestClass{ 

    @Before 
    public void setUp(){ 

     // Here I define the normal behaviour of mockObject 
     new NonStrictExpectations() {{ 
      mockObject.doSomething(); 
      result = "Everyting is OK!"; 
     }}; 

     // Other set up stuff... 

    } 

    // Other Tests... 

    /** 
    * This method tests that an error when calling 
    * mockObject.doSomething() is handled correctly. 
    */ 
    @Test(expected=Exception.class) 
    public void testMockObjectThrowsException(){ 

     // This Expectation is apparently ignored... 
     new NonStrictExpectations() {{ 
      mockObject.doSomething(); 
      result = "Something is wrong!"; 
     }}; 

     // Rest of test method... 

    } 
} 

उत्तर

5

मैं आम तौर पर सिर्फ एक निजी विधि है जो एक लौटाता हो Expectations प्रकार:

private Expectations expectTheUnknown() 
{ 
    return new NonStrictExpectations() 
    {{ 
     ... expectations ... 
    }}; 
} 

और फिर सिर्फ परीक्षण तरीकों सटीक उम्मीद की जरूरत है कि में विधि कॉल:

@Test public void testUknown() 
{ 
    expectTheUnknown(); 
    ... here goes the test ... 
} 
+0

इसका मतलब यह नहीं होता है कि आप मैन्युअल हर एक परीक्षा पद्धति पर expectTheUnknown() को लागू करने की जरूरत है? साथ ही, मुझे लगता है कि 'NonStrictExpectations' को वापस करने की वास्तव में आवश्यकता नहीं है। –

+0

@IbrahimArief यह कुछ समय हो गया है जब से मैंने जवाब लिखा था, लेकिन ओपीएआईआर, ओपी प्रश्न का मुद्दा यह था कि जब विधि को बुलाया गया था तो एक और अधिक बढ़िया नियंत्रण की आवश्यकता थी। मुझे नहीं लगता कि इसमें कोई संदेह नहीं है कि यह समाधान एक हैक है, लेकिन कम से कम यह काम करता है :) – Steen

+1

ओह यह खूबसूरती से काम करता है, इसमें कोई संदेह नहीं है। :) मैं सिर्फ अपनी चिंता की पुष्टि कर रहा था कि अपेक्षाओं को फैलाने के अलावा कोई अन्य तरीका नहीं है। किसी भी सामान्य मामले को ओवरराइड करने की विशेष अपेक्षाओं के बजाय जेमॉकिट में प्रत्येक विधि पर अज्ञात() परिभाषा। –

0

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

It is described here