2013-12-11 18 views
10

मैं मॉकिटो को मॉकिंग फ्रेमवर्क के रूप में उपयोग कर रहा हूं। मेरे पास एक scenerio है, मेरा कब (abc.method())। फिर वापसी (मान) मूल्य वापस नहीं करता है, इसके बजाय यह शून्य देता है।मॉकिटो जब विधि काम नहीं कर रहा है

public class DQExecWorkflowServiceImplTest { 
@InjectMocks 
DQExecWorkflowServiceImpl dqExecWorkflowServiceImpl = new DQExecWorkflowServiceImpl(); 
@Mock 
private DQUtility dqUtility; 
@Mock 
private DqExec dqExec; 
@Mock 
private DqCntlDefn dqCntlDefn; 
@Mock 
private DqCntlWfDefn dqCntlWfDefn; 
@Mock 
private DqCntlWfDefnTyp dqCntlWfDefnTyp; 
@Mock 
private IDQControlWfDefTypeService controlWfDefTypeService; 

@Before 
public void setUp() throws Exception { 
    dqExec = new DqExec(); 
    dqCntlWfDefn = new DqCntlWfDefn(); 
    dqUtility = new DQUtility(); 
    dqCntlWfDefnTyp = new DqCntlWfDefnTyp(); 
    dqCntlWfDefnTyp.setDqCntlWfDefnTypCd("MIN_INCLUSIVE_VAL"); 
    dqExecWorkflowServiceImpl 
      .setControlWfDefTypeService(controlWfDefTypeService); 

} 

@Test 
public void testExecuteWorkflow() { 
    when(controlWfDefTypeService.getDqCntlWfDefnTypCd(dqCntlWfDefn)) 
      .thenReturn(dqCntlWfDefnTyp); 
    dqExecWorkflowServiceImpl.executeWorkflow(dqExec, dqCntlWfDefn); 
} 

}

जावा वर्ग

@Override 
public DqCntlWfExec executeWorkflow(final DqExec dqExec, 
     final DqCntlWfDefn dqCntlWfDefn) { 
final DqCntlWfExec dqCntlWfExec = new DqCntlWfExec(); 
dqCntlWfExec.setDqCntlWfExecEffDt(dqUtil.getDefaultEffectiveDt()); 
dqCntlWfExec.setDqCntlWfExecExpDt(dqUtil.getDefaultExpiryDt()); 
dqCntlWfExec.setDqCntlWfDefn(dqCntlWfDefn); 
dqCntlWfExec.setDqExec(dqExec); 

final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService 
    .getDqCntlWfDefnTypCd(dqCntlWfDefn); 
    String workflowType = null; 
if(null!=dqCntlWfDefnTyp){ 
    workflowType = dqCntlWfDefnTyp.getDqCntlWfDefnTypCd(); 
} 

जब कभी मैं परीक्षण फ़ाइल को चलाने के लिए जब काम नहीं कर रहा और मैं buildpath में mockito1.8.5 जार उपयोग कर रहा हूँ। सेवा कॉल का मज़ाक उड़ाया जा रहा है लेकिन शून्य मूल्य देता है।

final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService 
    .getDqCntlWfDefnTypCd(dqCntlWfDefn); 

इस वस्तु dqCntlWfDefnTyp अशक्त

मैंने पहले यह किया है और जब, यह फ़ाइलों मैं पहले किया है के साथ काम कर रहा है वहाँ के साथ कोई समस्या नहीं थी। मैंने परीक्षण फ़ाइल के लिए एक ही प्रक्रिया का पालन किया था लेकिन मैं इस मुद्दे को समझ नहीं पाया। किसी को भी मुझे

सभी लोगों को धन्यवाद सहायता कृपया अग्रिम

+14

इसे एक छोटे से उदाहरण में कम करने का प्रयास करें, यह बहुत अपठनीय है। और मुझे यकीन है कि उन नामों को आपके नियंत्रण में नहीं है, क्योंकि 'setDqCntlWfExecEffDt' के लिए कोई बहाना नहीं है। ध्यान दें कि संक्षेप में कोड कितना असंगत है या नहीं: 'setDqCntlWfExecEffDt' बनाम' getDefaultEffectiveDt', 'executeWorkflow' बनाम' DqCntlWfExec', आदि गंभीर रूप से, कोड को TheDailyWTF को सबमिट किया जा सकता है। –

+0

कोड को दोबारा प्रतिक्रिया दी गई है और इसे पढ़ने योग्य बनाया गया है – Gopinathan

+0

क्या आप त्रुटि/आउटपुट जोड़ सकते हैं? आप कैसे जानते हैं कि यह 'शून्य' है? क्या आप इसे 'वर्कफ़्लो टाइप' से ले रहे हैं ... क्या यह हो सकता है।getDqCntlWfDefnTypCd() '' null' लौट रहा है? आदि ... FWIW, मुझे लगता है कि मूल कोड इस कुंजी को पकड़ सकता है। :-) – Jonathan

उत्तर

9

Mockito नकली कार्यों में कर सकते हैं जब हम वस्तुओं शिथिल नकली।

when(controlWfDefTypeService.getDqCntlWfDefnTypCd(any(DqCntlWfDefn.class)) 
    .thenReturn(dqCntlWfDefnTyp); 

इसके बजाय नकली वर्ग की वस्तु में उत्तीर्ण होने की, मैं Matcher any() साथ कक्षा उत्तीर्ण की है और यह काम करता है:

यहाँ परिवर्तन मैं इसे काम करने के लिए बनाया है।

2

मुझे लगता है कि मुझे आपकी समस्या मिली है, लेकिन सभी क्रेडिट मेरे पास नहीं जाते हैं।

चूंकि आप अपनी टेस्ट क्लास में 'dqCntlWfDefnTyp' का नकल करने की कोशिश कर रहे हैं और ऑब्जेक्ट को उस कक्षा में तुरंत चालू किया जा रहा है जिसे आप परीक्षण करने का प्रयास कर रहे हैं, आप अनिवार्य रूप से कुछ मुद्दों में भाग लेते हैं। प्राथमिक समस्या यह है कि ऑब्जेक्ट को मजाक नहीं किया जा सकता क्योंकि इसे परीक्षण के दौरान बनाया जा रहा है।

कुछ विकल्प हैं, लेकिन मेरी विनम्र राय में सबसे अच्छा विकल्प PowerMockito का उपयोग कर रहा है। आप उस वस्तु के भीतर ऑब्जेक्ट को प्रतिस्थापित करने में सक्षम होंगे जिसका परीक्षण आपके द्वारा किया जा रहा है।

@raspacorp से PowerMockito के इस प्रयोग इस question पर का एक उत्कृष्ट उदाहरण:

public class MyClass { 
void method1{ 
    MyObject obj1=new MyObject(); 
    obj1.method1(); 
} 
} 

और परीक्षण वर्ग ...

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyClass.class) 
public class MyClassTest { 
@Test 
public void testMethod1() {  
    MyObject myObjectMock = mock(MyObject.class); 
    when(myObjectMock.method1()).thenReturn(<whatever you want to return>); 
    PowerMockito.whenNew(MyObject.class).withNoArguments().thenReturn(myObjectMock); 

    MyClass objectTested = new MyClass(); 
    objectTested.method1(); 

    ... // your assertions or verification here 
} 
} 
1

मैं एक ही समस्या थी। मेरे लिए समाधान Mockito डाल दिया था। जब (...)। फिर वापसी (...); @ पहले-सेटअप विधि में।

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