জুন 5: একটি ব্যতিক্রম নিক্ষেপ করা হয় কীভাবে দৃ to়?


214

এইরূপে আরও ভাল উপায় আছে যে কোনও পদ্ধতি 5 জুনে একটি ব্যতিক্রম ছুঁড়ে ফেলে?

বর্তমানে, আমার পরীক্ষাটি একটি ব্যতিক্রম ছুঁড়েছে কিনা তা যাচাই করার জন্য আমাকে একটি @ বিধি ব্যবহার করতে হবে, তবে আমি যে পরীক্ষাগুলিতে আমার পরীক্ষায় ব্যতিক্রম ছুঁড়ে দেওয়ার একাধিক পদ্ধতি আশা করি সে ক্ষেত্রে এটি কাজ করে না।


1
আপনি ব্যতিক্রমগুলি পরীক্ষা করতে এটিরেটজে যাচাই করতে আগ্রহী হতে পারেন এটি ইউএনআইটি 5 এর চেয়ে আরও নমনীয়
ব্যবহারকারী 1075613

উত্তর:


323

আপনি ব্যবহার করতে পারেন assertThrows(), যা আপনাকে একই পরীক্ষার মধ্যে একাধিক ব্যতিক্রম পরীক্ষা করার অনুমতি দেয়। জাভা 8-এ ল্যাম্বডাসের সহায়তায়, জুনিয়নেট ব্যতিক্রমগুলির জন্য এটি পরীক্ষার সাধারণ উপায়।

প্রতি JUnit ডক্স :

import static org.junit.jupiter.api.Assertions.assertThrows;

@Test
void exceptionTesting() {
    MyException thrown = assertThrows(
           MyException.class,
           () -> myObject.doThing(),
           "Expected doThing() to throw, but it didn't"
    );

    assertTrue(thrown.getMessage().contains("Stuff"));
}

11
একটি পুরানো স্কুল থেকে "জুনিট 5 সম্পর্কে আমি বেশি কিছু জানিনা এবং জাভা 8 সম্পর্কে সম্ভবত যথেষ্ট নয়" ... এটি বরং উদ্ভট দেখাচ্ছে। আপনি আরও কিছু ব্যাখ্যা যুক্ত করতে আপত্তি করতে চান; "সত্যিকারের 'প্রোডাকশন কোড' কোন অংশে পরীক্ষার অধীনে রয়েছে ... যেটি নিক্ষেপ করা হবে?"
ঘোস্টটিক

1
() -> শূন্য আর্গুমেন্ট গ্রহণ করে এমন একটি ল্যাম্বডা এক্সপ্রেশনকে নির্দেশ করে। সুতরাং, "উত্পাদনের কোড" ব্যতিক্রম প্রত্যাশিত বলে প্রত্যাশিত কোড ব্লকের মধ্যে নির্দেশিত (যেমন, throw new...কোঁকড়ানো বন্ধনীগুলির মধ্যে বিবৃতি)।
স্যাম ব্রান্নেন

1
সাধারণত ল্যাম্বডা এক্সপ্রেশন পরীক্ষার অধীনে বিষয়টির সাথে ইন্টারঅ্যাক্ট করবে (SUT)। অন্য কথায়, উপরের মতো সরাসরি একটি ব্যতিক্রম ছুঁড়ে দেওয়া কেবল বিক্ষোভের উদ্দেশ্যে।
স্যাম ব্রানেন

1
প্রত্যাশার মতো মনে হচ্ছে তিনটি ছিন্ন করা হয়েছে। ডক্স এখন পরিবর্তে assertThrows () ব্যবহার করতে বলে।
Depesypher

5
সংস্করণ 5.0.0-M4 হিসাবে প্রত্যাশার মতো আর কোনও উপলভ্য নেই। কেবলমাত্র assertTh्रास অনুমোদিত। Github.com/junit-team/ জুনit5 / blob / master / docamentation / src / docs /… দেখুন : ' Assertions.assertThrows ()' এর পক্ষে বিলোপ করা Assertions.expectThrows () পদ্ধতি সরানো হয়েছে '
gil.fernandes

91

জাভা 8 এবং JUnit 5 (বৃহস্পিটার) এ আমরা নিম্নলিখিত হিসাবে ব্যাতিক্রমের জন্য দৃ as়ভাবে বলতে পারি। ব্যবহারorg.junit.jupiter.api.Assertions.assertThrows

পাবলিক স্ট্যাটিক <টি প্রসারিত থ্রোবাল> টি এসার্টট্রোস (ক্লাস <টি> প্রত্যাশিত টাইপ, এক্সিকিউটেবল এক্সিকিউটেবল)

জোর দিয়ে থাকে যে সরবরাহযোগ্য নির্বাহযোগ্যের কার্যকর করা প্রত্যাশিত টাইপের একটি ব্যতিক্রম ছুঁড়ে ফেলে এবং ব্যতিক্রমটি ফিরিয়ে দেয়।

যদি কোনও ব্যতিক্রম নিক্ষেপ করা হয় না, বা যদি কোনও ভিন্ন ধরণের ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে এই পদ্ধতিটি ব্যর্থ হবে।

আপনি যদি ব্যতিক্রম উদাহরণে অতিরিক্ত চেক সম্পাদনা করতে না চান তবে কেবলমাত্র ফেরতের মানটিকে উপেক্ষা করুন।

@Test
public void itShouldThrowNullPointerExceptionWhenBlahBlah() {
    assertThrows(NullPointerException.class,
            ()->{
            //do whatever you want to do here
            //ex : objectName.thisMethodShoulThrowNullPointerExceptionForNullParameter(null);
            });
}

যে পদ্ধতির প্রায়োগিক ইন্টারফেস ব্যবহার করবে Executableমধ্যে org.junit.jupiter.api

তথ্যসূত্র:


1
এই এক সঙ্গে শীর্ষে! এই পর্যন্ত যে দ্বারা সর্বোত্তম উত্তর সবচেয়ে আপ-টু-ডেট JUnit 5. এছাড়াও সঙ্গে, IntelliJ নিচে ল্যামডা ঘনীভূত হয় এমনকি আরও যদি আছে ল্যামডা করার জন্য শুধু একটা লাইন:assertThrows(NoSuchElementException.class, myLinkedList::getFirst);
anon58192932

26

তারা এটি 5 ইউনাইটে পরিবর্তন করেছে (প্রত্যাশিত: অবৈধআর্গুমেন্ট এক্সপেশন, প্রকৃত: আহবান পদ্ধতি) এবং কোডটি এর মতো দেখাচ্ছে:

@Test
public void wrongInput() {
    Throwable exception = assertThrows(InvalidArgumentException.class,
            ()->{objectName.yourMethod("WRONG");} );
}

21

এখন জুনিট 5 ব্যতিক্রমগুলি দৃsert় করার একটি উপায় সরবরাহ করে

আপনি সাধারণ ব্যতিক্রম এবং কাস্টমাইজড ব্যতিক্রম উভয়ই পরীক্ষা করতে পারেন

একটি সাধারণ ব্যতিক্রম দৃশ্য:

ExpectGeneralException.java

public void validateParameters(Integer param ) {
    if (param == null) {
        throw new NullPointerException("Null parameters are not allowed");
    }
}

ExpectGeneralExceptionTest.java

@Test
@DisplayName("Test assert NullPointerException")
void testGeneralException(TestInfo testInfo) {
    final ExpectGeneralException generalEx = new ExpectGeneralException();

     NullPointerException exception = assertThrows(NullPointerException.class, () -> {
            generalEx.validateParameters(null);
        });
    assertEquals("Null parameters are not allowed", exception.getMessage());
}

আপনি এখানে কাস্টমএক্সসেপশন পরীক্ষা করতে একটি নমুনা পেতে পারেন: ব্যতিক্রম কোডের নমুনা যুক্ত করুন

ExpectCustomException.java

public String constructErrorMessage(String... args) throws InvalidParameterCountException {
    if(args.length!=3) {
        throw new InvalidParameterCountException("Invalid parametercount: expected=3, passed="+args.length);
    }else {
        String message = "";
        for(String arg: args) {
            message += arg;
        }
        return message;
    }
}

ExpectCustomExceptionTest.java

@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
JUnit বিল্ট-ইন এবং কাস্টম ব্যতিক্রমগুলি কীভাবে পরিচালনা করে তার মধ্যে কোনও পার্থক্য নেই।
রায়ন্দেভ

9

আমি মনে করি এটি একটি আরও সাধারণ উদাহরণ

List<String> emptyList = new ArrayList<>();
Optional<String> opt2 = emptyList.stream().findFirst();
assertThrows(NoSuchElementException.class, () -> opt2.get());

get()একটি খালি রয়েছে ArrayListএমন একটি al চ্ছিককে কল করা একটি নিক্ষেপ করবে NoSuchElementExceptionassertThrowsপ্রত্যাশিত ব্যতিক্রম ঘোষণা করে এবং একটি ল্যাম্বডা সরবরাহকারী সরবরাহ করে (কোনও যুক্তি নেয় না এবং কোনও মূল্য ফেরত দেয়)।

তার উত্তরটির জন্য @ প্রাইমকে ধন্যবাদ, যা আমি আশাবাদী এর দ্বারা বিস্তারিতভাবে বর্ণনা করেছি।


1
পদ্ধতিটি assertThrowsনিক্ষিপ্ত ব্যতিক্রমকে ফিরিয়ে দেয়। আপনি NoSuchElementException e = assertThrows(NoSuchElementException.class, () -> opt2.get());নীচের মত আপনি করতে পারেন নীচে আপনি চান ব্যতিক্রম অবজেক্টে যা চান বাছাই করতে পারেন।
ক্যাপ্টেন ম্যান

8

আপনি ব্যবহার করতে পারেন assertThrows()। আমার উদাহরণটি দস্তাবেজ থেকে নেওয়া হয়েছে http://junit.org/ জুন it5/ docs/ current/ user- guide/

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

....

@Test
void exceptionTesting() {
    Throwable exception = assertThrows(IllegalArgumentException.class, () -> {
        throw new IllegalArgumentException("a message");
    });
    assertEquals("a message", exception.getMessage());
}

2

একটি এমনকি সহজ একটি লাইনার। জাভা 8 এবং JUnit 5 ব্যবহার করে এই উদাহরণের জন্য কোনও ল্যাম্বডা এক্সপ্রেশন বা কোঁকড়া ধনুর্বন্ধনী প্রয়োজন

import static org.junit.jupiter.api.Assertions.assertThrows;

@Test
void exceptionTesting() {

    assertThrows(MyException.class, myStackObject::doStackAction, "custom message if assertion fails..."); 

// note, no parenthesis on doStackAction ex ::pop NOT ::pop()
}

1

আসলে আমি মনে করি এই বিশেষ উদাহরণের জন্য ডকুমেন্টেশনে একটি ত্রুটি রয়েছে। পদ্ধতিটি যা প্রত্যাশিত তা হ'ল

public static void assertThrows(
public static <T extends Throwable> T expectThrows(

3
"Assertions.SsertThrows () এর পক্ষে অবমূল্যায়িত Assertions.expectThrows () পদ্ধতিটি সরানো হয়েছে।"
মার্টিন শ্র্রেডার

জুনিট 5 এর জন্য, এটি org.junit.jupiter.api.Assertions থেকে org.testng.Assert নয় তা নিশ্চিত করুন। আমাদের প্রকল্পে জুনিট এবং টেস্টএনজি উভয়ই অন্তর্ভুক্ত রয়েছে এবং আমি অ্যাসেটরেক্সকে অ্যাসেটএক্সপ্যাক্টে পরিবর্তন না করা পর্যন্ত অকার্যকর ত্রুটি পেয়েছি। দেখা গেল যে আমি org.testng.Asert ব্যবহার করছিলাম।
ব্যারিকু

-5

এখানে একটি সহজ উপায়।

@Test
void exceptionTest() {

   try{
        model.someMethod("invalidInput");
        fail("Exception Expected!");
   }
   catch(SpecificException e){

        assertTrue(true);
   }
   catch(Exception e){
        fail("wrong exception thrown");
   }

}

এটি তখনই সফল হয় যখন আপনি প্রত্যাশা ব্যতিক্রমটি ছুঁড়ে দেওয়া হয়।

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