2013-08-21 9 views
5
में मजाक

मैं निम्नलिखित जावा वर्गों है:नेस्टेड विधि Mockito

public class A 
{ 
    @Autowired 
    private B b; 
    public int aFn() 
    { 
     int something = b.bFn(); 
    } 
} 
public class B 
{ 
    @Autowired 
    private C c; 
    public int bFn() 
    { 
     int something = c.cFn(); 
    } 
} 
public class C 
{ 
    public int cFn() 
    { 
     return 231; 
    } 
} 

और निम्न परीक्षण Mockito का उपयोग करके उपरोक्त कोड का परीक्षण करने के लिए:

public class test 
{ 
    @Autowired 
    private A a; 

    private C c; 

    @Test 
    public void testA() 
    { 
     c = mock(C.class); 
     when(c.cFn(),anyInt()).thenReturn(something); 
     assertEquals(0, a.aFn()); 
    } 
} 

जब मैं टेस्टा डिबग, मुझे लगता है कि असली लगता है सी। सीएफएन() मजाकिया नहीं, निष्पादित हो जाता है। क्या कुछ भी है जो मैं गलत तरीके से कर रहा हूं? कृपया मदद करें!

उत्तर

8

सबसे पहले, आपको हमेशा किसी ऑब्जेक्ट की प्रत्यक्ष निर्भरताओं का नकल करना चाहिए, न कि इसकी पारस्परिक निर्भरता। इसलिए आपको बी का परीक्षण करना चाहिए, सी नहीं, ए का परीक्षण करने के लिए। फिर आप सी

दूसरा: आप यूनिट परीक्षण में कहीं भी नकली इंजेक्शन नहीं दे रहे हैं। क्या आप होना चाहिए:

public class Test { 

    // not autowired here 
    private A a; 

    private B mockB; 

    @Test 
    public void testA() { 
     mockB = mock(B.class); 
     when(b.bFn(), anyInt()).thenReturn(something); 

     // the missing part: injecting the mock into the tested object 
     a = new A(mockB); 
     // or a = new A(); 
     // a.setB(mockB); 

     assertEquals(0, a.aFn()); 
    } 
} 

आप नकली (B.class) का उपयोग करते हैं, तो आप बी से एक नकली उदाहरण मतलब यह नहीं है कि सभी बी के अन्य उदाहरण क्या नकली करता है क्या करेंगे मिलता है।

ए परीक्षण करने के लिए सी मॉकिंग एक बुरा अभ्यास है: यूनिट परीक्षणों को दूसरों के अलगाव में एक वर्ग का परीक्षण करना चाहिए। लेकिन अगर आप वास्तव में चाहते हैं, तो एक नकली सी बनाएं, बी बनाएं और इसके अंदर नकली सी इंजेक्ट करें, फिर ए बनाएं और इसके अंदर बी इंजेक्ट करें।

A --> B --> mockC 
+0

मैं b.cbn नहीं, c.cfn stub करना चाहता हूं। इसके लिए क्या किया जाना चाहिए? – user1471283

+0

यह एक बुरा अभ्यास है। यूनिट परीक्षणों को दूसरों के अलगाव में एक वर्ग का परीक्षण करना चाहिए। लेकिन अगर आप इसे चाहते हैं, तो एक नकली सी बनाएं, बी बनाएं और इसके अंदर नकली सी इंजेक्ट करें, फिर ए बनाएं और इसके अंदर बी इंजेक्ट करें। 'ए -> बी -> मॉकसी'। –

+0

धन्यवाद। कृपया इसके अनुसार अपना उत्तर संशोधित करें। – user1471283

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