मॉकिटो कैसे एक नकली अपवाद को मॉक और मुखर करना है?


136

मैं जॉकिट टेस्ट में मॉकिटो का उपयोग कर रहा हूं। आप एक अपवाद कैसे बनाते हैं और फिर यह कहते हैं कि इसमें (सामान्य छद्म कोड) है

जवाबों:


75

BDD स्टाइल सॉल्यूशन (जावा 8 को अपडेट किया गया)

अपवादों को संभालने के लिए अकेले मॉकिटो सबसे अच्छा समाधान नहीं है, कैच-अपवाद के साथ मॉकिटो का उपयोग करें

मॉकिटो + कैच-एक्सेप्शन + एसेरज

given(otherServiceMock.bar()).willThrow(new MyException());

when(() -> myService.foo());

then(caughtException()).isInstanceOf(MyException.class);

नमूना कोड

निर्भरता


2
"कैच-अपवाद" क्या है? एक लिंक मिल गया?
डंकन जोन्स

क्या है caughtException?
बजे सैफ मसाडे

गया, यह से आ रहा हैcom.googlecode.catchexception.CatchException.caughtException;
सैफ Masadeh

212

पहले अपने दूसरे प्रश्न का उत्तर देने के लिए। यदि आप JUnit 4 का उपयोग कर रहे हैं, तो आप अपने परीक्षण को एनोटेट कर सकते हैं

@Test(expected=MyException.class)

यह दावा करने के लिए कि एक अपवाद उत्पन्न हुआ है। और मॉकिटो के साथ "मॉक" एक अपवाद है, उपयोग करें

when(myMock.doSomething()).thenThrow(new MyException());

2
यह दृष्टिकोण उस स्थिति के लिए अस्वीकार्य है जब आप उस वस्तु का परीक्षण कर रहे हों जिसमें कुछ अवस्था हो। उदाहरण के लिए एक वस्तु विधि है जो अपवाद को फेंकता है यदि आप इसे दूसरी बार कहते हैं। और आपको यह परीक्षण करने के लिए परीक्षण करने की आवश्यकता है कि यह दूसरी विधि कॉल के दौरान अपवाद नहीं फेंकता है, न कि पहला। यदि यह पहली विधि कॉल (तैयारी चरण में) के दौरान MyException को फेंकता है, तो उसे परीक्षण विफल होना चाहिए। लेकिन इस दृष्टिकोण के साथ हम जांच नहीं कर पा रहे हैं कि किस विधि से कॉल अपवाद को फेंका जाए।
स्नेग

हालांकि इस मामले में हम पहली विधि कॉल से अपवाद को पकड़ सकते हैं और इसे RuntimeException में लपेट सकते हैं।
स्नेग

29

यदि आप अपवाद संदेश का परीक्षण करना चाहते हैं, तो आप मॉकिटो के साथ JUnit's ExpectedException का उपयोग कर सकते हैं:

@Rule
public ExpectedException expectedException = ExpectedException.none();

@Test
public void testExceptionMessage() throws Exception {
    expectedException.expect(AnyException.class);
    expectedException.expectMessage("The expected message");

    given(foo.bar()).willThrow(new AnyException("The expected message"));
}

given()यह कहां से आता है?
मोहम्मद फैसल


मैं @ नियम का उपयोग करना भी पसंद करता हूं, क्योंकि इस तरह मैं अपेक्षित संदेश या कारण या अपवाद से संबंधित अन्य सामान के लिए परीक्षण कर सकता हूं। अपवाद के कारण की जांच के लिए, मैं उपयोग करता हूं: अपेक्षितException.expectCause (Mockito.sameInstance (अपेक्षितException)) या अपेक्षितException.expectCause (Mockito.instanceOf (MyException.class)) और कुछ अन्य जो काम में आते हैं।
क्रेंगुटा एस

19

06/19/2015 के लिए अपडेट किया गया उत्तर (यदि आप java 8 का उपयोग कर रहे हैं)

बस अस्सर का उपयोग करें

Assertj-core-3.0.0 + Java 8 Lambdas का उपयोग करना

@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
                                  .isInstanceOf(IllegalArgumentException.class);
}

संदर्भ: http://blog.codeleak.pl/2015/04/junit-testing-exception-with-java-.html


मेरे लिए काम किया ... इसके अलावा हम अपवाद संदेश को भी देख सकते हैं। asertThatThrownBy () -> myService.sumTingWong ("badArg")। हैमेज ("परीक्षण") ".isInstanceOf (IllegalArgumentException.class);
श्रीतम जगदेव '

17

यदि आप JUnit 4, और Mockito 1.10.x का उपयोग कर रहे हैं, तो अपनी परीक्षा विधि को इस प्रकार बताएं:

@Test(expected = AnyException.class)

और अपने इच्छित अपवाद का उपयोग करने के लिए:

Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();

16

अपवाद इस तरह से करें:

when(obj.someMethod()).thenThrow(new AnException());

यह सत्यापित करें कि आपका परीक्षण इस तरह के अपवाद को फेंक देगा।

@Test(expected = AnException.class)

या सामान्य नकली सत्यापन द्वारा:

verify(obj).someMethod();

बाद वाले विकल्प की आवश्यकता होती है यदि आपका परीक्षण यह साबित करने के लिए डिज़ाइन किया गया है कि मध्यवर्ती कोड अपवाद को संभालता है (यानी अपवाद आपके परीक्षण विधि से नहीं फेंका जाएगा)।


क्या verifyकॉल अपवाद का दावा करता है?
NilsH

@ निलेश नं। लेकिन बशर्ते कि whenखंड सही है, यह एक अपवाद फेंक दिया होगा।
डंकन जोन्स

10

मॉकिटो के डोह्रो का उपयोग करें और फिर बाद में फेंकने के लिए वांछित अपवाद को पकड़ें

@Test
public void fooShouldThrowMyException() {
    // given
    val myClass = new MyClass();
    val arg = mock(MyArgument.class);
    doThrow(MyException.class).when(arg).argMethod(any());
    Exception exception = null;

    // when
    try {
        myClass.foo(arg);
    } catch (MyException t) {
        exception = t;
    }

    // then
    assertNotNull(exception);
}

5

मॉकिटो का उपयोग करके, आप अपवाद बना सकते हैं।

when(testingClassObj.testSomeMethod).thenThrow(new CustomException());

Junit5 का उपयोग करते हुए, आप अपवाद का दावा कर सकते हैं, यह दावा करते हैं कि परीक्षण विधि लागू होने पर वह अपवाद फेंक दिया गया है या नहीं ।

@Test
@DisplayName("Test assert exception")
void testCustomException(TestInfo testInfo) {
    final ExpectCustomException expectEx = new ExpectCustomException();

     InvalidParameterCountException exception = assertThrows(InvalidParameterCountException.class, () -> {
            expectEx.constructErrorMessage("sample ","error");
        });
    assertEquals("Invalid parametercount: expected=3, passed=2", exception.getMessage());
}

यहां एक नमूना खोजें: अपवाद जून को जोर दें


धन्यवाद ! मेरे लिए काम किया
हरिश्चोर

1

मॉकिटो से संबंधित, कोई भी अपवाद को पकड़ सकता है और इसके गुणों का पता लगा सकता है। यह सत्यापित करने के लिए कि अपवाद हुआ, अपवाद को फेंकने वाले कथन के बाद कोशिश ब्लॉक के भीतर एक गलत स्थिति का दावा करते हैं।


@ मर्सिज़ की प्रतिक्रिया सही ढंग से जवाब देती है कि आप जो कह रहे हैं वह
मॉकिटो

@pringi धन्यवाद, मैं देख रहा हूं कि प्रश्न दोनों के अपवाद का मजाक उड़ा रहा है और इसे पकड़ रहा है। मुझे आश्चर्य है कि अगर यह परीक्षण के तहत कोड के किसी भी व्यवहार पर निर्भर करता है।
eel ghEEz

1

या यदि आपका अपवाद एक वर्ग के निर्माता से फेंका गया है:

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void myTest() {    

    exception.expect(MyException.class);
    CustomClass myClass= mock(CustomClass.class);
    doThrow(new MyException("constructor failed")).when(myClass);  

}

-1

अपवाद संदेश द्वारा जोर:

    try {
        MyAgent.getNameByNode("d");
    } catch (Exception e) {
        Assert.assertEquals("Failed to fetch data.", e.getMessage());
    }

यदि इस तरह से लिखा गया है, जब कोई अपवाद नहीं है, तो परीक्षण अभी भी पास होगा । जो हम पहले स्थान पर बचना चाहते हैं
क्रिश्चियन लिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.