2010-08-16 11 views
19

निम्नलिखित इकाई परीक्षण चल रहा है पर कोई आखिरी कॉल अपवाद फेंकता एक नकली उपलब्धEasyMock 3.0, मजाक वर्ग फेंकता java.lang.IllegalStateException: java.lang.IllegalStateException: एक नकली उपलब्ध


import org.easymock.*; 
import org.junit.*; 

public class MyTest { 

    @Test 
    public void testWithClass() { 
     Thread threadMock = EasyMock.createMock(Thread.class); 
     EasyMock.expect(threadMock.isAlive()).andReturn(true); 
    } 
} 
पर कोई आखिरी कॉल

मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं और वेब पर कोई अच्छा उदाहरण नहीं मिल रहा है। EasyMock 3.0 का उपयोग करके आप कक्षा को कैसे नकल करते हैं। उपर्युक्त इकाई परीक्षण में क्या गलत है? किसी भी तरह की सहायता का स्वागत किया जाएगा।

मेरे परियोजना

<dependency> 
    <groupId>org.easymock</groupId> 
    <artifactId>easymock</artifactId> 
    <version>3.0</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>cglib</groupId> 
    <artifactId>cglib-nodep</artifactId> 
    <version>2.2</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.objenesis</groupId> 
    <artifactId>objenesis</artifactId> 
    <version>1.2</version> 
    <scope>test</scope> 
</dependency> 

उत्तर

10

आपका परीक्षा पद्धति, ठीक लग रहा है, सिवाय इसके तैयार नहीं कि आपके पास नकली वस्तु आपके द्वारा बनाए गए निम्न Maven निर्भरता भी शामिल है। यह

EasyMock.replay(mockObject1, mockObject2, ...); 

का उपयोग कर यह मज़ाक उड़ाया वस्तु तैयार करेंगे ताकि वह एक जो अपने JUnit चलाने पर इस्तेमाल किया जाएगा किया जा सकता है। आपकी निर्भरताओं के साथ कोई समस्या नहीं है।

इसके अलावा, आप वास्तविक विधि पर कॉल नहीं कर रहे हैं, जो आप यहां यूनिट-परीक्षण कर रहे हैं। आम तौर पर, टेस्ट विधि लिखने का तरीका, जॉबिट विधि लिखना होगा, मैकिंग libs (जैसे कि EasyMock और PowerMock) का उपयोग करके, जब परीक्षण विधि संदर्भ से परे बाहरी ऑब्जेक्ट होते हैं, और फिर सभी मॉक ऑब्जेक्ट्स को फिर से चलाते हैं (जो तैयार करता है परीक्षण में वास्तविक व्यापार वस्तुओं के लिए विकल्प के लिए mocks)। उसके बाद, आप उस वास्तविक विधि को कॉल करते हैं जिसे आप परीक्षण करने का प्रयास कर रहे हैं, और org.junit.Assert.assertXXX() विधियों का उपयोग करके कार्यक्षमता को मान्य करें।

17

इस अपवाद का कारण यह है कि Thread#isAlive()final विधि है, लेकिन EasyMock अंतिम विधियों के मॉकिंग का समर्थन नहीं करता है। इसलिए, EasyMock.expect(...) के अंदर दिखाई देने वाली इस विधि को कॉल "नकली पर कॉल" के रूप में नहीं देखा जाता है।

ऐसे JMockit के रूप में अंतिम तरीकों आप एक अलग मजाक उपकरण की जरूरत है, (जो मैं विकसित) नकली करने के लिए:

public void testMockingFinalMethod(@Mocked("isAlive") Thread mock) 
{ 
    new Expectations() 
    {{ 
     mock.isAlive(); result = true; 
    }}; 

    assertTrue(mock.isAlive()); 
} 

मजाक एपीआई वास्तव में की आवश्यकता नहीं है कि तरीकों को स्पष्ट रूप से निर्दिष्ट कर रहे हैं, में मज़ाक उड़ाया जा करने के लिए सामान्य मामला Thread कक्षा हालांकि एक मुश्किल है।

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