2013-05-15 14 views
17

अरे मैं अपने JSF आवेदन के लिए और mocks मैं mockito उपयोग कर रहा हूँ के लिए कुछ परीक्षण लागू करने के लिए प्रयास करें। (मैं भी वसंत का उपयोग)Mockito नकली वस्तुओं रिटर्न अशक्त

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Mock 
    private GeneralConfig gen; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     generalConfigService = new GeneralConfigService(); 
     ReflectionTestUtils.setField(generalConfigService, "generalConfigDAO", generalConfigDAO);     
    } 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
     gen = createGeneralConfigs("label", "value"); 

     generalConfigService.setInstance(gen); 
     generalConfigService.persist(); 
     log.info(generalConfigService.getInstance().toString()); 
    } 
} 

परीक्षण सफल होता है, लेकिन जब मैं getInstance विधि के साथ उदाहरण प्राप्त करना चाहते हैं। सभी पैरामीटर्स जिन्हें मैंने पहले सेट किया है (पहले कन्स्ट्रक्टर के माध्यम से) शून्य हैं। मैं मजाकिया वस्तुओं के लिए नया हूं, तो क्या यह व्यवहार सामान्य है, या क्या मेरे कोड में कोई गलती है?

+0

यह मजाक के रूप में आप प्रश्न में वस्तु नकली नहीं है से संबंधित होना प्रकट नहीं होता है। –

उत्तर

14

यह वास्तव में GeneralConfigService # getInstance() कार्यान्वयन पर निर्भर करता है। यदि आप @InjectMocks एनोटेशन का उपयोग करते हैं तो आप अपने टेस्ट कोड को बहुत सरल बना सकते हैं।

जब MockitoJUnitRunner का उपयोग कर आप मैन्युअल रूप से mocks प्रारंभ करने और अपने निर्भरता इंजेक्षन करने की जरूरत नहीं:

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    @InjectMocks 
    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() { 
     // generalConfigService is already instantiated and populated with dependencies here 
     ... 
    } 
} 
+0

बस इस यहाँ छोड़ रहा है: https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/ –

3

सभी विधि कॉल करने के लिए Mockito mocks डिफ़ॉल्ट रूप से अशक्त लौट आते हैं। यदि आप इसे कुछ और वापस करना चाहते हैं तो आपको इसे when कथन के माध्यम से ऐसा करने की आवश्यकता है।

यह आप सोच रहे हैं कि निम्नलिखित काम करेंगे लगता है ... आप setInstance फोन और फिर मान कि setInstance को पारित किया गया था के बाद से यह कैसे काम करेगा डीएओ है वापस जाने के लिए getInstance की उम्मीद है। यदि यह आप क्या प्रयास कर रहे हैं है, तो आप getInstance बुला getInstance के बाद से वापस आ जाएगी जो कुछ भी आप वापस जाने के लिए नकली कॉन्फ़िगर किया है और क्या setInstance को पारित किया गया था से कोई संबंध नहीं होगा द्वारा setInstance का परीक्षण नहीं करना चाहिए। इसके बजाय, verify का उपयोग मान्य करने के लिए है कि DAO की उचित विधि setInstance विधि से बुलाया गया था।

उदाहरण के लिए, यदि GeneralConfigService.setInstance कॉल GeneralConfigDAO.setInstance तो अपने परीक्षण इस तरह दिखना चाहिए ...

@Test 
public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
gen = createGeneralConfigs("label", "value"); 

generalConfigService.setInstance(gen); 
generalConfigService.persist(); 

verify(genConfigDAO).setInstance(sameInstance(gen)); 
} 

इसके अलावा, अगर gen एक नकली (@Mock के माध्यम से) तुम क्यों gen = createGeneralConfigs...

के माध्यम से उसे किसी और में बताए जाते हैं
6

MockitoAnnotations.initMocks(this); 

उपयोग करने के लिए आप obje मजाक रहे हैं, तो मत भूलना एनोटेशन के माध्यम से सीटी अर्थात @Mock Objectname

+1

initMocks जब आवश्यकता नहीं है मॉकिटो जुनीट धावक का उपयोग करना। –

+0

टिप्पणी के लिए धन्यवाद। किसी भी तरह से मेरा मानना ​​है कि ... –

+0

आज मैं मुख्य कक्षा में नकली उपयोग कर रहा हूं। हाँ ~ – Tiina

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