মকিতো কীভাবে উপহাস করবেন এবং নিক্ষিপ্ত ব্যতিক্রমটিকে দৃsert়তার সাথে বলবেন?


136

আমি জুনিট টেস্টে মকিতো ব্যবহার করছি। কীভাবে আপনি একটি ব্যতিক্রম ঘটায় এবং তারপরে এটি দৃsert়ভাবে জানাতে পারেন যে (জেনেরিক সিউডো কোড)

উত্তর:


75

বিডিডি স্টাইল সলিউশন (জাভা 8 এ আপডেট হয়েছে)

ব্যতিক্রম হ্যান্ডেল করার জন্য একা মকিতো সেরা সমাধান নয়, ক্যাচ-এক্সেপশন সহ মকিতো ব্যবহার করুন

মকিতো + ক্যাচ- ব্যাতিকরণ + AssertJ

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

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

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

কোডের উদাহরণ

নির্ভরতা


2
"ধরা-ব্যতিক্রম" কী? একটি লিঙ্ক আছে?
ডানকান জোন্স

কি caughtException?
সাইফ মাসাদেহ

বুঝতে পেরেছি, এটি আসছেcom.googlecode.catchexception.CatchException.caughtException;
সাইফ মাসাদেহ

212

প্রথমে আপনার দ্বিতীয় প্রশ্নের উত্তর দেওয়ার জন্য। আপনি JUnit 4 ব্যবহার করে থাকলে আপনি নিজের পরীক্ষাটি দিয়ে এ্যানোটেট করতে পারেন

@Test(expected=MyException.class)

একটি ব্যতিক্রম ঘটেছে যে দৃsert়তা। এবং মকিতো সহ একটি ব্যতিক্রম "উপহাস" করতে, ব্যবহার করুন

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

2
আপনি যখন কোনও রাজ্যের কোনও অবজেক্টের পদ্ধতি পরীক্ষা করছেন তখন এই পদ্ধতির ক্ষেত্রে অগ্রহণযোগ্য। উদাহরণস্বরূপ একটি অবজেক্ট পদ্ধতি রয়েছে যা আপনি দ্বিতীয়বার কল করলে ব্যতিক্রম ছুঁড়ে মারে। এবং এটি পরীক্ষা করার জন্য আপনাকে পরীক্ষা করাতে হবে যে এটি প্রথম পদ্ধতি নয়, দ্বিতীয় পদ্ধতির কলের সময় ব্যতিক্রম ঘটায়। যদি এটি প্রথম পদ্ধতির কল করার সময় MyException ছুঁড়ে দেয় (প্রস্তুতির পর্যায়ে) তবে এটি পরীক্ষায় ব্যর্থ হওয়া উচিত। তবে এই পদ্ধতির সাহায্যে আমরা কোন পদ্ধতির কল করতে ব্যতিক্রম ছুঁড়ে ফেলা হয়েছে তা পরীক্ষা করতে সক্ষম নই।
স্নেগ

যদিও এই ক্ষেত্রে আমরা প্রথম পদ্ধতি কল থেকে ব্যতিক্রমটি ধরতে পারি এবং এটি রানটাইম এক্সসেপশনে গুটিয়ে রাখতে পারি।
স্নেগ

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()এটা কোথা থেকে আসে?
মোহাম্মদ ফয়সাল 14


আমি @ বিধি ব্যবহার করতেও পছন্দ করি, কারণ এইভাবে আমি প্রত্যাশিত বার্তা বা কারণ বা ব্যতিক্রম সম্পর্কিত অন্যান্য সামগ্রী পরীক্ষা করতে পারি। ব্যতিক্রমটির কারণ যাচাই করার জন্য, আমি ব্যবহার করি: প্রত্যাশিতএক্সেপশন.এক্সপেক্টকজ (মকিতো.সেমইনস্ট্যান্স (প্রত্যাশিত এক্সপশন)) বা প্রত্যাশিত এক্সসেপশন.এক্সপেক্টকৌজ (মকিতো.ইনস্ট্যান্সঅফ (মাই এক্সেপশন.ক্লাস)) এবং আরও কয়েকটি যে কাজে আসে।
ক্রেঙ্গুটা এস

19

06/19/2015 এর জন্য আপডেট উত্তর (আপনি যদি জাভা 8 ব্যবহার করছেন)

শুধু assertj ব্যবহার করুন

Assertj-core-3.0.0 + জাভা 8 লাম্বডাস ব্যবহার করা হচ্ছে

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

তথ্যসূত্র: http://blog.codeleak.pl/2015/04/junit-testing- ধারণার সাথে- java-8.html


আমার জন্য কাজ করেছে ... এছাড়াও আমরা ব্যাতিক্রমের বার্তাটিও চেক করতে পারি T
শ্রীতম জগদেব

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();

যদি আপনার পরীক্ষাটি মধ্যবর্তী কোড ব্যতিক্রমকে পরিচালনা করে তা প্রমাণ করার জন্য ডিজাইন করা হয় তবে পরবর্তী বিকল্পটি প্রয়োজনীয় the


verifyকল কি ব্যতিক্রম দৃsert়তা দেয়?
নিলশ

@ নীলস নং। তবে শর্তটি 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());

জুনিট 5 ব্যবহার করে, আপনি ব্যতিক্রম দৃsert় করতে পারেন, জোর দিয়েছিলেন যে পরীক্ষার পদ্ধতিটি চালু করার সময় সেই ব্যতিক্রম নিক্ষিপ্ত হয় কিনা ।

@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

মকিতোর সাথে সম্পর্কিত নয়, যে কেউ ব্যতিক্রমটি ধরতে পারে এবং এর বৈশিষ্ট্যগুলি জোড় করে দিতে পারে। ব্যতিক্রম ঘটেছে তা যাচাই করতে, ব্যতিক্রমটি ছুঁড়ে ফেলার বিবৃতি দেওয়ার পরে চেষ্টা ব্লকের মধ্যে একটি মিথ্যা শর্ত চাপান।


@ মারিয়াসস এর প্রতিক্রিয়া সঠিকভাবে উত্তর দিয়েছে আপনি যা বলছেন তা
মকিতোর

@ প্রিঙ্গি ধন্যবাদ, আমি দেখতে পাচ্ছি যে প্রশ্নটি ব্যতিক্রমকে ব্যঙ্গ করে এবং এটি ধরা উভয়ই সম্পর্কিত। আমি যদি আছি তবে এটি যদি পরীক্ষার অধীনে কোডের কোনও আচরণের উপর নির্ভর করে।
ইয়েল 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());
    }

যদি এভাবে লেখা হয়, যখন কোনও ব্যতিক্রম ছুঁড়ে না দেওয়া হয়, তখনও পরীক্ষাটি পাস হবে । আমরা প্রথমে যা এড়াতে চাই
ক্রিশ্চিয়ান লিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.