2012-11-30 12 views
8

मेरे पास dao.create() कॉल है जिसे मैं किसी विधि का परीक्षण करते समय नकली करना चाहता हूं। लेकिन मुझे कुछ याद आ रहा है क्योंकि मुझे अभी भी एनपीई मिल रहा है। यहाँ क्या गलत है?एक निजी दाओ चर कैसे नकल करने के लिए?

class MyService { 
    @Inject 
    private Dao dao; 

    public void myMethod() { 
     //.. 
     dao.create(object); 
     // 
    } 
} 

मैं dao.create() कॉल को कैसे नकल कर सकता हूं?

@RunWith(PowerMockRunner.class) 
@PrepareForTest(DAO.class) 
public void MyServiceTest { 

    @Test 
    public void testMyMethod() { 
     PowerMockito.mock(DAO.class); 

     MyService service = new MyService(); 
     service.myMethod(); //NPE for dao.create() 
    } 
} 
+0

कक्षा "डीएओ" या "दाओ" है? – fgb

+0

कुछ अच्छे समाधान आपके द्वारा उपयोग किए जा रहे निर्भरता इंजेक्शन ढांचे पर निर्भर करते हैं। कृपया एक उचित टैग जोड़ें (guice, spring, ...) –

उत्तर

5

आप डीएओ इंजेक्शन नहीं दे रहे हैं। मॉकिटो के साथ आप @ इंजेक्शनमोक्स का उपयोग करने के लिए अपनी टेस्ट क्लास बदल सकते हैं और मॉकिटो धावक का उपयोग कर सकते हैं।

@RunWith(MockitoJUnitRunner.class) 
public void MyServiceTest { 
    @Mock 
    private Dao dao; 
    @InjectMocks 
    private MyService myService; 
    ... 
} 

आप Inject Mocks API

सरल तरीका पर InjectMocks के बारे में अधिक पढ़ सकते हैं निर्माता द्वारा इंजेक्शन के लिए अपने इंजेक्शन बदल रहा है। उदाहरण के लिए, आप MyService को

class MyService { 
    ... 
    private final Dao dao; 

    @Inject 
    public MyService(Dao dao) { 
     this.dao = dao; 
    } 
    ... 
} 

फिर अपने परीक्षण को सेटअप में मॉक किए गए डीएओ को सरल कर सकते हैं।

... 
@Mock 
private Dao dao; 

@Before 
public void setUp() { 
    this.dao = mock(Dao.class); 
    this.service = new MyService(dao); 
} 
... 

अब आप अगर create बुलाया गया था जांच करने के लिए, की तरह verify उपयोग कर सकते हैं:

... 
    verify(dao).create(argThat(isExpectedObjectBeingCreated(object))); 
} 

private Matcher<?> isExpectedObjectBeingCreated(Object object) { ... } 

निर्माता द्वारा इंजेक्शन का उपयोग करते हुए अपने निर्भरता अन्य डेवलपर्स के लिए स्पष्ट करने देगा और यह मदद मिलेगी जब परीक्षण बनाने :)

+0

गरीब अंग्रेजी के बारे में क्षमा करें: पी –

+1

आप अंग्रेजी खराब नहीं है और यह मुझे बहुत मदद करता है। धन्यवाद! – membersound

1

आपको अभी भी अपने नकली के साथ दाओ क्षेत्र सेट करने की आवश्यकता है। आप इस पर प्रतिबिंब का उपयोग कर सकते हैं।

1

आपको अपनी सेवा कक्षा में मॉक ऑब्जेक्ट डीएओ इंजेक्ट/सेट करने की आवश्यकता है।

यदि यह एक वसंत आधारित परियोजना है, तो आप आप new MyService() का उपयोग करते हैं दाव कभी नहीं इंजेक्ट किया जाता है एक नज़र @ स्प्रिंग JUnit Testrunner

0

हो सकता है। दाओ को इंजेक्शन देने के लिए आपको ApplicationContext (वसंत) या Injector (गुइस) के माध्यम से MyService लोड करने की आवश्यकता है। जैसा कि आप अपने सामान्य आवेदन में करेंगे।

0

जैसा कि अन्य ने पहले ही कहा है, आपको dao फ़ील्ड को अपने MyService कक्षा में कुछ फ़ैशन में सेट करने की आवश्यकता है। मैं पावरमॉक और डीआई फ्रेमवर्क धावक (पॉवरमॉक को मानते हुए) दोनों का उपयोग करने के लिए आपके परीक्षण पर एक कंपाउंड धावक की अनुमति देने के लिए तंत्र को अनिश्चित कर रहा हूं, लेकिन जब तक आप पहले से ही PowerMock का उपयोग कर रहे हैं (दिए गए उदाहरण में अस्पष्ट कारणों से) , दाओ को मैन्युअल रूप से सेट करने के लिए आप Whitebox कक्षा का लाभ उठा सकते हैं।

public void testMyMethod() { 
    Dao dao = mock(Dao.class) 
    doNothing().when(dao).create(anyObject())); //assuming no return val for dao.create() 

    MyService service = new MyService(); 
    Whitebox.setInternalState(service, "dao", dao); 

    service.myMethod(); 
} 
संबंधित मुद्दे