2012-05-30 31 views
5

उदा। के मैं इस वर्ग है मान लीजिए:क्या EasyMock का उपयोग करके किसी ऑब्जेक्ट को आंशिक रूप से नकल करने का कोई तरीका है?

public class Foo Implements Fooable { 
    public void a() { 
    // does some stuff 
    bar = b(); 
    // moar coadz 
    } 
    public Bar b() { 
    // blah 
    } 
    // ... 
} 

और मैं Foo.a परीक्षण करना चाहते हैं। मैं Foo.b का नकल करना चाहता हूं, क्योंकि मैं उस विधि को अलग से जांच रहा हूं।

public class FooTest extends TestCase { 
    public void testA() { 
    Fooable foo = createPartialMock(
     Fooable.class, // like with createMock 
     Foo // class where non-mocked method implementations live 
    ); 

    // Foo's implementation of b is not used. 
    // Rather, it is replaced with a dummy implementation 
    // that records calls that are supposed to be made; 
    // and returns a hard coded value (i.e. new Bar()). 
    expect(foo.b()).andReturn(new Bar()); 

    // The rest is the same as with createMock: 
    // 1. Stop recording expected calls. 
    // 2. Run code under test. 
    // 3. Verify that recorded calls were made. 
    replay(foo); 
    foo.a(); 
    verify(foo); 
    } 
} 

मैं जानता हूँ कि मैं अपने ही Foo मेरे लिए बात की इस तरह करने के लिए उपवर्ग लिख सकते हैं: क्या मैं कल्पना कर रहा हूँ कुछ इस तरह है। लेकिन अगर ऐसा नहीं करना है, तो मैं ऐसा नहीं करना चाहता, क्योंकि यह कठिन है यानी स्वचालित होना चाहिए।

उत्तर

2

मुझे लगता है कि आप EasyMock एक्सटेंशन लाइब्रेरी का उपयोग करके ऐसा कर सकते हैं। आप इस Partial Mocking

+0

धन्यवाद आंशिक नकली बना सकते हैं! अफसोस की बात है, ऐसा लगता है कि क्लैसक्स्टेंशन का उपयोग करने के लिए आपको जूनिट 4 की आवश्यकता है :(: http://easymock.org/EasyMock2_2_ClassExtension_Documentation.html मुझे लगता है कि इसका मतलब है कि जूनिट 3 उपयोगकर्ता भाग्य से बाहर हैं। – allyourcode

+0

ओह ... यह एक अच्छी जानकारी है मुझे भी ... मेरे पास आपके मामले पर एक विचार है ... लेकिन यह आसान मॉक का उपयोग नहीं कर रहा है बल्कि विधियों को ओवरराइड करके अपने आप से मॉक्स बना रहा है और विस्तारित मॉक क्लास से अपना मॉक 'बार' ऑब्जेक्ट वापस कर सकता है। – raddykrish

+2

EasyMock 3.1 के रूप में , क्लास एक्स्टेंशन लाइब्रेरी को बहिष्कृत किया गया है और आंशिक मॉकिंग को इज़ीमॉक में ही स्थानांतरित कर दिया गया है। यह कहता है कि यह जुनीट 3 के साथ काम करता है ताकि आप भाग्यशाली हो सकें: http://easymock.org/EasyMock3_1_Documentation.html – DoctorRuss

1

में यहां एक साधारण उदाहरण पा सकते हैं मुझे जुनीट 4 में अपग्रेड करने और क्लैसक्स्टेंशन का उपयोग करने का एक तरीका मिलेगा। (वास्तव में, मैं EasyMock के बजाय Mockito का प्रयोग करेंगे, लेकिन अपने पूरे टेस्ट स्वीट पुनर्लेखन नहीं करते हैं।) आप नहीं है, तो आप हमेशा अपनी खुद की जासूसी thusly बना सकते हैं कर सकते हैं:

public class FooTest extends TestCase { 
    public static class FooSpy extends Foo { 
     private final Fooable mockFoo; 

     FooSpy(Fooable mockFoo) { 
      this.mockFoo = mockFoo; 
     } 

     public Bar b() { 
      return mockFoo.b(); 
     } 
    } 

    public void testA() { 
     Fooable mockFoo = createMock(Foo.class); 
     Fooable fooSpy = new FooSpy(mockFoo); 

     // Foo's implementation of b is not used. 
     // Rather, it is replaced with a dummy implementation 
     // that records calls that are supposed to be made; 
     // and returns a hard coded value (i.e. new Bar()). 
     expect(mockFoo.b()).andReturn(new Bar()); 

     // The rest is the same as with createMock: 
     // 1. Stop recording expected calls. 
     // 2. Run code under test. 
     // 3. Verify that recorded calls were made. 
     replay(mockFoo); 
     foo.a(); 
     verify(foo); 
    } 

} 
+0

लेकिन FooSpy लिखना बिंदु की तरह नहीं है। – allyourcode

+0

यह बिंदु है, जब तक कि आप classextensions का उपयोग करने में सक्षम न हो जाएं - तो आपके पास cre के लिए ढांचा नहीं है तुम्हारे लिए अपने जासूस खा लिया। ऐसा लगता है कि आप भाग्य में हो सकते हैं, हालांकि, @ डॉक्टररस की टिप्पणी के आधार पर। – jhericks

2

ओपी दिखाई देता है (?) यह सुझाव देने के लिए कि आंशिक मॉकिंग से उप-वर्गीकरण किसी भी तरह से कठिन या कठिन है। मेरा सुझाव है कि यह पुनर्विचार करने लायक है।

उदाहरण के लिए, परीक्षण कक्षा में:

Foo dummyFoo = new Foo() { 
     @Override public Bar b() { return new Bar(); } 
    }; 

क्या करता है ओ पी राज्यों, सरल लगता है, और कम अन्य समस्याओं से ग्रस्त (पुनः चलाने के लिए/सत्यापित/आदि भूल जाना।), EasyMock का उपयोग करने से।

+1

मुझे नहीं पता था कि आप जावा में ऐसा कर सकते हैं! मुझे लगता है कि यह 1.4 के बाद बाहर आया? वैसे भी, क्या आप इसका इस्तेमाल नकली बनाने के लिए कर सकते हैं, जो जेरिकिक्स के सुझाव के समान है? यदि ऐसा है, तो यह अच्छा होगा, क्योंकि आपको तब एक पूरी नई (उप) कक्षा बनाने की ज़रूरत नहीं है जो परीक्षण के तहत विधियों के लिए नकली कहलाता है। – allyourcode

9

EasyMock 3.0+ में, आप का उपयोग कर mockbuilder

EasyMock.createMockBuilder(class).addMockedMethod("MethodName").createMock();