2012-04-04 10 views
5

मैं मैक बनाने के लिए EasyMock का उपयोग कर रहा हूं जो परीक्षण कक्षा में निजी पैरामीटर (सेटटर के बिना) में से एक है। मैंने प्रतिबिंब का उपयोग करने की कोशिश की - लेकिन यह सही ढंग से काम नहीं करता है।परीक्षण वर्ग निजी क्षेत्र में EasyMock नकली इंजेक्षन कैसे करें

public class TestedClassTest{ 
    @Test 
    public void test(){ 
     TestedClass instance = new TestedClass(); 
     MockedClass mocked = EasyMock.createMock(MockedClass.class); 
     Data data = new Data(); 

     //Void setter 
     DataType dataType = (myDataType.DataType) EasyMock.anyObject(); 
     mocked.setDataType(dataType); 
     EasyMock.expectLastCall(); 

     //expect 
     EasyMock.expect(mocked.getData()).andReturn(data); 
     EasyMock.replay(mocked); 

     Field field = instance.getClass().getDeclaredField("mockedClass") 
     field.setAccessible(true); 
     field.set(instance, mocked); 

     //run tested method 
     instance.someAction(); 

     EasyMock.verify(mocked); 
    } 
} 

इम विफल हो रही जानकारी:

Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 
junit.framework.AssertionFailedError: 
Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 

इम यकीन है कि इस विधि का परीक्षण किया "instance.someAction()" के दौरान "MockedClass" वस्तु पर निकाल दिया जाता है

कैसे इस समस्या को हल करने के लिए?

संपादित - उत्तर: के बाद दोगुनी को सही replay.mocked() मैंने पाया (इतना आसान!) कि एक और शून्य विधि EasyMock.expectLastCall()

उत्तर

3

आपका प्रतिबिंब कोड का उपयोग कर घोषित किया जाना चाहिए ठीक लग रहा है।

यह लंबे समय से रहा है क्योंकि मैंने EasyMock का उपयोग किया है, लेकिन replay केवल एक परीक्षण में प्रति नकली नहीं कहा जाना चाहिए? आप इसे दो बार बुला रहे हैं। पहले replay कॉल से छुटकारा पाने का प्रयास करें।

इस मामले में, क्या यह समझ में आता है कि नकली सार्वजनिक है? आम तौर पर, सहयोगी को या तो कन्स्ट्रक्टर या सेटर के माध्यम से सेट किया जाना चाहिए, प्रतिबिंब की आवश्यकता को खत्म करना।

संपादित करें - आपके अपडेट के आधार पर - त्रुटि इंगित करती है कि setDataType को नकली पर बुलाया गया था, लेकिन नकली इसे कॉल करने की अपेक्षा नहीं करता था। शायद आपकी कक्षा इसे दो बार बुला रही है, शायद इसे आदेश से बाहर बुलाया जा रहा है, या इसे उस तर्क के साथ बुलाया जा रहा है जिसकी आपने अपेक्षा नहीं की थी (हालांकि मुझे उम्मीद है कि इस मामले में त्रुटि अलग होगी)।

+0

सुधार किया गया है और अभी भी इसी तरह की समस्या है – Marcin

+0

क्या आपको यकीन है कि त्रुटि समान है? – hvgotcodes

+0

संपादित कोड और त्रुटि, thx! – Marcin

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