2012-08-29 9 views
15

मैं यह देखने के लिए एक विधि का नकल करने की कोशिश कर रहा हूं कि मैं अपवाद को सही तरीके से संभालता हूं या नहीं। जहां तक ​​मुझे मिलता है।डू थ्रो में मॉकिटो अपवाद जो सही दिखता है

इंटरफ़ेस:

interface SampleManager { 
    void deleteVariome(String specimenId, String analysisId) throws Exception; 
    // ... 
} 

इकाई परीक्षण:

// ... 
SampleManger sampleManager = mock(SampleManager.class); 

// below is line 753 
doThrow(Exception.class).when(sampleManager).deleteVariome(sample1.getId(), analysisId); 

परिणाम:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 
-> at ...server.ArchiveManagerImplUTest.deleteVariomeFails(ArchiveManagerImplUTest.java:753) 

E.g. thenReturn() may be missing. 
Examples of correct stubbing: 
    when(mock.isOk()).thenReturn(true); 
    when(mock.isOk()).thenThrow(exception); 
    doThrow(exception).when(mock).someVoidMethod(); <-- this looks a log like what I did! 

Hints: 

1. missing thenReturn() 

2. you are trying to stub a final method, you naughty developer! <-- I have a lot of other mocks of this interface in this test that work. 

उत्तर

0

आप एक उदाहरण Exception.class नहीं अपवाद वर्ग के ही की आपूर्ति करने के लिए है ।

doThrow(new Exception()).when(sampleManager).deleteVariome(sample1.getId(), analysisId); 

संपादित खैर @DavidWallace मुझे सही है, तो चेतावनी दी (या बल्कि प्रबुद्ध) कि 1.9 के बाद से आप सिर्फ फेंकने के लिए अपवाद वर्ग प्रदान कर सकते हैं और यह आपके लिए एक का निर्माण करेगी।

+2

नहीं है, के बाद Mockito 1.9.0 से, आप अपवाद वर्ग आपूर्ति कर सकते हैं, और यह रूप में काम करेंगे अपेक्षित होना।हालांकि, भले ही ओपी मॉकिटो के पुराने संस्करण का उपयोग कर रहा हो, फिर भी वे उस लक्षण को नहीं प्राप्त करेंगे जिसका वे वर्णन कर रहे हैं। मेरा मानना ​​है कि समस्या कुछ अलग है। –

+0

धन्यवाद डेविड। उसे नहीं पता था। मैं अपना जवाब यहां छोड़ दूंगा ताकि अन्य आपकी टिप्पणी के माध्यम से जागरूक हो सकें। –

4

यह त्रुटि आमतौर पर उस स्थान के बाद रिपोर्ट की जाती है जहां वास्तव में यह हुआ था। यदि आप कुछ ठीक से स्टब करने में विफल रहते हैं, तो आमतौर पर मॉकिटो तब तक नहीं बता सकता जब तक कि आप मॉकिटो विधियों में से किसी एक को कॉल न करें। यह एक ही परीक्षण विधि में हो सकता है, एक ही कक्षा में बाद में परीक्षण विधि, या यहां तक ​​कि एक पूरी तरह से अलग परीक्षण वर्ग भी हो सकता है।

जो पंक्ति आपने उद्धृत की है वह मुझे ठीक लगती है। इसके ऊपर की रेखाओं पर एक नज़र डालें, जहां आप एक मॉकिटो स्टबिंग या सत्यापन विधि कहते हैं। यह बहुत संभावना है कि आपके पास when है जिसमें thenReturn, then या thenThrow कोई संबद्ध नहीं है। या आपके पास verify हो सकता है जिसमें वास्तविक विधि कॉल गुम है। कुछ अन्य संभावनाएं भी हैं।

यदि आपको उद्धृत किए गए किसी भी पंक्ति के ऊपर लाइनों में कोई त्रुटि नहीं मिल रही है, तो अपने कुछ कोड पोस्ट करें, और मैं एक नजदीक देखो।

+1

यदि आप जुनीट धावक 'मॉकिटोज़ुनिटरुनर.क्लास' का उपयोग करते हैं, तो मॉकिटो जांच करेगा कि आपकी टेस्ट विधि में कोई अधूरा स्टबिंग नहीं है। जो इस त्रुटि को समस्या के स्रोत में अलग करने में मदद करेगा। – Brice

+0

ओपी: यदि आप यह सुनिश्चित करना चाहते हैं कि यह समस्या है, तो यह आसान है: बस उस विशिष्ट एक परीक्षण विधि को चलाएं और आपको यह ठीक काम करना चाहिए। या आप अपने वास्तविक परीक्षण तर्क से ठीक पहले एक नकली रीसेट डाल सकते हैं, और आप पाते हैं कि परीक्षण ठीक चलाता है। ये डेविड वालेस –

+0

द्वारा वर्णित समस्या के लक्षण हैं, लेकिन समस्या वास्तव में एक ही परीक्षण विधि में हो सकती है। तो आपको केवल एक परीक्षण विधि चलने में त्रुटि मिल सकती है। उस स्थिति में, 'MockitoJUnitRunner' का उपयोग करके भी आपकी सहायता नहीं होगी। –

17

एक समान समस्या से जो मैंने अभी भाग लिया था, मुझे संदेह है कि sample एक नकली है, और आपने sample.getId() कहीं और स्टब किया है? इससे किसी भी तरह से मेरे मामले में यह समस्या आई।

किसी कारण से, मॉकिटो परेशान हो जाता है यदि आप doThrow के साथ उपयोग किए गए स्टब में से एक तर्क को इस तरह से मजाक कर रहे हैं। असीमित लूप से बचने के लिए शायद यह एक तरह से प्रवेश की जांच है, मुझे नहीं पता।

भले ही, sample.getId() को निरंतर मूल्य के साथ बदलने का प्रयास करें और इससे समस्या हल होनी चाहिए। आप नकली और इसके आगे के किसी भी उपयोग के लिए अपने परीक्षण में निरंतर घोषित करने पर विचार कर सकते हैं। फिर आप यह भी देख सकते हैं कि sample.getId() का उपयोग उस विधि द्वारा किया गया था जिसका आप परीक्षण कर रहे हैं verify पर एक और कॉल जोड़कर।

+0

मुझे एक ही समस्या का सामना करना पड़ा .. इसे एक नकली के बजाय निरंतर मूल्य पारित करके हल किया गया। –

+0

धन्यवाद आदमी! मैं इसे 'तत्कालीन पुनर्नवीनीकरण' विधि में स्थानीय वैरिएबल के बजाय सीधे गेटर से मूल्य से गुजरकर हल करता हूं। – Juancho

4

जैसा कि गिज द्वारा दिए गए उत्तर में वर्णित है, यह शायद मॉकिटो में एक बग के कारण है। यहां एक संपूर्ण परीक्षण है जो यह पुनरुत्पादित करता है:

interface Sample { String getId(); } 
interface SampleManager { 
    void deleteVariome(String specimenId, String analysisId); 
} 

@Test 
public void probableMockitoBug() { 
    Sample sample1 = mock(Sample.class); 
    when(sample1.getId()).thenReturn("a"); 

    SampleManager manager = mock(SampleManager.class); 
    doThrow(Exception.class).when(manager).deleteVariome(sample1.getId(), "b"); 

    manager.deleteVariome("a", "b"); 
} 

परीक्षण निम्नलिखित उत्पादन का उत्पादन:

 
org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 
-> at org.mockitousage.JavadocExamplesTest.probableMockitoBug(JavadocExamplesTest.java:404) 

E.g. thenReturn() may be missing. 
Examples of correct stubbing: 
    when(mock.isOk()).thenReturn(true); 
    when(mock.isOk()).thenThrow(exception); 
    doThrow(exception).when(mock).someVoidMethod(); 
Hints: 
1. missing thenReturn() 
2. you are trying to stub a final method, you naughty developer! 

    at org.mockito.exceptions.Reporter.unfinishedStubbing(Reporter.java:55) 
    at org.mockito.internal.progress.MockingProgressImpl.validateState(MockingProgressImpl.java:74) 
    at org.mockito.internal.progress.ThreadSafeMockingProgress.validateState(ThreadSafeMockingProgress.java:49) 
    at org.mockito.internal.MockHandler.handle(MockHandler.java:71) 
    at org.mockito.internal.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:36) 
    at org.mockito.internal.creation.MethodInterceptorFilter.intercept(MethodInterceptorFilter.java:48) 
    at org.mockitousage.JavadocExamplesTest$Sample$$EnhancerByMockitoWithCGLIB$$d5ac41.getId() 
    at org.mockitousage.JavadocExamplesTest.probableMockitoBug(JavadocExamplesTest.java:404) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) 
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) 
+0

यदि ऐसा है, तो सरल कामकाज है: 'doThrow (Exception.class)। जब (प्रबंधक) .deleteVariome ("a", "b"); ' –