দৃsert়ভাবে বলা যে কোনও বস্তু একটি নির্দিষ্ট ধরণের


195

JUnit- এ কি সম্ভব যে কোনও বস্তু শ্রেণীর উদাহরণ? বিভিন্ন কারণে আমার পরীক্ষায় আমার একটি অবজেক্ট রয়েছে যেটির প্রকারটি পরীক্ষা করতে চাই। এটি কি এক প্রকারের অবজেক্ট 1 বা এক প্রকারের অবজেক্ট 2?

বর্তমানে আমার আছে:

assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);

এটি কাজ করে তবে আমি ভাবছিলাম যে এটি করার আরও কোনও মত প্রকাশের উপায় আছে কিনা।

উদাহরণস্বরূপ যেমন:

assertObjectIsClass(myObject, Object1);

আমি এটি করতে পারি:

assertEquals(myObject.class, Object1.getClass());

একটি নির্দিষ্ট দৃ method়পদ পদ্ধতি আছে যা আমাকে আরও মার্জিত, তরল পদার্থে কোনও ধরণের অবজেক্টের পরীক্ষা করতে দেয়?


15
আপনি কি সচেতন assertTrue(myObject instanceof Object1);এবং assertEquals(myObject.class, Object1.getClass());আসলে আলাদা পরীক্ষা? প্রথমটি মায়োবজেক্টকে একটি সাবক্লাসের উদাহরণ হিসাবে গ্রহণ করে Object1, পরে দেয় না।
এরিক কিটজমুয়েলার

@ammoQ খুব ভাল পয়েন্ট। আমি সাবক্লাসের কথা ভাবিনি। Clarifaction জন্য ধন্যবাদ
RNJ

1
মাবা দেখায়, হ্যামক্রেস্ট ব্যবহার বিবেচনা করুন। এটি আরও ভাল যাতে আপনার আরও ভাল কাজ করার পরীক্ষা হয়। হ্যামক্রস্ট স্ট্যান্ডার্ডের চেয়ে ব্যর্থতার আরও অনেক ভাল লগিং সরবরাহ করে assertTrueassertTrueকেবল বলেছিলেন expected true got false, হ্যামক্রস্ট বলবেনexpected instanced of XYZ, got instance of ABC
জন বি

উত্তর:


253

আপনি assertThatJUnit এর সাথে আসে এমন পদ্ধতি এবং ম্যাচারগুলি ব্যবহার করতে পারেন ।

এই লিঙ্কটি একবার দেখুন যা যুনিত ম্যাচার্স সম্পর্কে কিছুটা বর্ণনা করে।

উদাহরণ:

public class BaseClass {
}

public class SubClass extends BaseClass {
}

টেস্ট:

import org.junit.Test;

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;

/**
 * @author maba, 2012-09-13
 */
public class InstanceOfTest {

    @Test
    public void testInstanceOf() {
        SubClass subClass = new SubClass();
        assertThat(subClass, instanceOf(BaseClass.class));
    }
}


3
এফওয়াইআই, ম্যাচচারআসর্ট.সেসার্টটি আস্রেস্ট.এসর্টটিটের চেয়ে ভাল আচরণ করে (ত্রুটির ক্ষেত্রে আরও ভাল লগিং সরবরাহ করে)। আমি পরিবর্তে এটি ব্যবহার করার পরামর্শ দিচ্ছি। hamcrest.org/ javaHamcrest
জন বি

13
এটি একটি তুচ্ছ বক্তব্য এবং উদাহরণটিতে সত্য না হলে একটি সংকলন ত্রুটি হবে! সাধারণত আপনি ক্লাসের শ্রেণিবিন্যাসের সাথে যেতে চান instanceof: BaseClass subClass = new SubClass(); assertThat(subClass, isA(SubClass.class));তবে এটি সংকলন করে না কারণ SubClassএটি নয় ? super BaseClass
TWiStErRob

3
@TWiStErRob আমি বুঝতে পারছি না কি আপনি এখানে যা বলার ... পরিবর্তন করার চেষ্টা করুন চেষ্টা করছেন instanceOf(BaseClass.class)করার instanceOf(String.class)এবং আপনি দেখতে পাবেন এটি শুধু জরিমানা কম্পাইল কিন্তু একটি AssertionError নিক্ষিপ্ত থাকবে।
মাবা

1
@ মাবা, তিনি কোনও কারণে ইসের কথা বলছেন, যা ক্লাসটি ক্যাপচার করে, এটি Class<T>পরিবর্তে গ্রহণ করে Class<?>(যা উদাহরণস্বরূপ হয়)। যেহেতু এটি ক্লাসটি ক্যাপচার করে, তাই এটি ISA করার একটি সংকলন সময় ত্রুটি হবে উদাহরণের সাথে বেমানান একটি শ্রেণীর সাথে। github.com/hamcrest/JavaHamcrest/issues/39
Vsevolod Golovanov

46

যেহেতু assertThatপুরানো উত্তরটি এখন অবহেলা করা হয়েছে, তাই সঠিক সমাধানটি পোস্ট করছি:

assertTrue(objectUnderTest instanceof TargetObject);


2
যদি অবজেক্টউন্ডার টেস্টটি টার্গেটঅবজেক্টের একটি সাবক্লাস হয়, তবে এটি এখনও trueডান হয়ে যাবে? এবং আমি মনে করি আপনি প্রকৃত প্রকারটি পরীক্ষা করতে চান।
এরিকজি

আমি মনে করি এটি সঠিক উত্তর নয়। মূল প্রশ্নটি এমন কিছু জন্য জিজ্ঞাসা করছিল যা নির্দিষ্টভাবে অবজেক্টের সঠিক ধরণের পরীক্ষা করে। এই সমাধানগুলি এটি করে না (উপরে @ ইরকজি দ্বারা উল্লিখিত) এবং এটি এমনকি ব্যবহারকারীরা প্রাথমিকভাবে প্রশ্ন জিজ্ঞাসা করেছেন, সুতরাং অবশ্যই "সঠিক" উত্তর ইমো নয়। সঠিক উত্তরের জন্য, দয়া করে ফ্র্যাঙ্কলিন ইউ উত্তরটি দেখুন।
কেককো 12

ঠিক আছে, এর নেতিবাচক দিকটি রয়েছে যা ফ্রিকলিনের উত্তর সম্পর্কে হ'ল, এরিকজি হ্যাঁ উল্লেখ করেছেন - আমি কেবল এটি দেখলাম, এবং এটি আমার কোনও তাৎপর্যপূর্ণ ছিল না তাই আমি জুনিট 5 এর সাথে আমার প্রকল্পে পরীক্ষা করেছি - এটি ভুল! উদাহরণস্বরূপ এমন কোনও সিনট্যাক্স নেই, বা ইনস্ট্যান্সঅফ নামেও কোনও পদ্ধতি নেই! তিনি সম্পূর্ণ ভুল। আমি এখনও আমার উত্তরের পাশে দাঁড়িয়ে আছি এবং প্রমাণ হিসাবে এটি কমপক্ষে 30 জন ব্যক্তির পক্ষে এটি সহায়ক ছিল যারা এটির উন্নতি করেছিলেন! (আমি আপনাকে নিচু করে ধরেছি)
কারমাজেডন

@ কেককো 12 আমার উত্তরটি সঠিক ধরণেরটি পরীক্ষা করে না; এটি এই উত্তরের মতো সাবক্লাস গ্রহণ করে। আমি এটিকে সম্বোধন করতে আমার উত্তর আপডেট করেছি; দুঃখিত যে আমি এই অংশটি প্রশ্নের মধ্যে লক্ষ্য করি নি। আমি মনে করি সঠিক সাম্যতা বেশিরভাগ দৃ as় গ্রন্থাগারে অন্তর্ভুক্ত করা হয়নি কারণ এটি প্রায়শই ব্যবহৃত হয় না।
ফ্রাঙ্কলিন ইউ

@ কারমাজেডন ফ্রেঞ্চলিন ইউয়ের উত্তর সঠিকভাবে কাজ করে যদি আপনি হ্যামক্রেষ্ট দৃ as় আমদানি ব্যবহার করেন: stat `` স্ট্যাটিক org.hamcrest.CoreMatchers.instanceOf আমদানি করুন; code `` ss তার কোড নমুনা প্রতি। আমি স্বীকার করি যদিও আমি ফ্র্যাঙ্কলিন উত্তরটিকে উপেক্ষা করেছি এবং বাস্তবে, এই 2 টি উত্তর কার্যকারিতা সমতুল্য, সুতরাং আমি অনুমান করি এটি শেষ পর্যন্ত কেবল পছন্দ করার বিষয়।
কেককো 12

21

JUnit 5 এর সমাধান

নথি বলছে:

যাইহোক, জুনিট বৃহস্পতির org.junit.jupiter.Assertionsক্লাসে জুনিট assertThat()4 এর org.junit.Assertক্লাসে পাওয়া একটি মত কোনও পদ্ধতি সরবরাহ করে না যা হ্যামক্রেস্ট গ্রহণ করে Matcher। পরিবর্তে, বিকাশকারীদের তৃতীয় পক্ষের দৃ libra় লাইব্রেরি দ্বারা সরবরাহকৃত ম্যাচচারগুলির জন্য অন্তর্নির্মিত সমর্থনটি ব্যবহার করতে উত্সাহিত করা হয়।

হামক্রস্টের উদাহরণ :

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.jupiter.api.Test;

class HamcrestAssertionDemo {

    @Test
    void assertWithHamcrestMatcher() {
        SubClass subClass = new SubClass();
        assertThat(subClass, instanceOf(BaseClass.class));
    }

}

উদাহরণস্বরূপ AssertJ :

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

class AssertJDemo {

    @Test
    void assertWithAssertJ() {
        SubClass subClass = new SubClass();
        assertThat(subClass).isInstanceOf(BaseClass.class);
    }

}

নোট করুন যে এটি ধরে নিয়েছে আপনি অনুরূপ আচরণগুলি পরীক্ষা করতে চান instanceof(যা সাবক্লাসগুলি গ্রহণ করে)। আপনি যদি ঠিক সমান প্রকার চান, তবে প্রশ্নটিতে আপনি উল্লিখিত মত দুটি শ্রেণিকে সমান হতে বলার চেয়ে ভাল উপায় আমি দেখতে পাচ্ছি না।


1
এক অর্থে, আসলটি assertThat()হ্যামক্রেস্টের কাছে পিছিয়ে গেছে, যাতে ইউনিত তৃতীয় পক্ষের বক্তব্য গ্রন্থাগারগুলির সাথেও কাজ করে।
ফ্র্যাঙ্কলিন ইউ

আমি কেবল এই উত্তরটি পরীক্ষা করেছি, এটি সঠিক নয় এবং একাধিক সংকলনের ত্রুটি বাড়ে: অভিব্যক্তির অবৈধ সূচনা, প্রকারের অবৈধ সূচনা, ';' প্রত্যাশিত ... অন্য কথায়, আপনার দ্বিতীয় পরামিতি assertTatch ম্যাচারে, "উদাহরণস্বরূপ (বেসক্লাস.class)" হতে পারে না! আসলে, আপনি এমনকি এটি সঠিকভাবে টাইপ করেন নি, আপনি ব্যবহার করেছেন এমন সিনট্যাক্সটি কিছুটা আলাদা - "InstanceOf (" - - একটি ফাংশন কল হিসাবে! আসলে এরকম কোনও ফাংশন নেই ... এমনকি এটি কি কেউ পরীক্ষা করেছিলেন? মনে হয় এটি নিজেই হয়েছে? কোনও পরীক্ষা ছাড়াই টাইপ করা হয়েছে
কারমেজডন

@ কারমাজেডন আমি দুটি উত্তর সরবরাহ করেছি, একটি হ্যামক্রস্টের এবং অন্যটি অ্যাসেটজে-এর জন্য। কোনটি আপনার সম্পর্কে কথা বলা হয়?
ফ্রাঙ্কলিন ইউ

@ কারমাজেডন আমি সন্দেহ করি যে আপনি হামক্রস্টের উদাহরণের কথা বলছেন এবং আপনি মিস করেছেন টাইপ করে instanceOfinstanceof ( মনে রাখবেন) হিসাবে করেছেন । instanceOfহয় একটি ফাংশন যখন instanceofহয় একটি জাভা শব্দ
ফ্রাঙ্কলিন ইউ

আমি অবশ্যই হ্যামক্রেস্টের একটি উল্লেখ করেছি এবং আপনি কীভাবে লিখেছেন তা লক্ষ্য করার পরে আমি কীওয়ার্ড এবং একটি ফাংশন হিসাবে উভয়ই চেষ্টা করেছিলাম - এমন কোনও ফাংশন নেই ...
কারমেজডন

3

কোটলিনের 5 জুনিয়তের সমাধান!

হামক্রস্টের উদাহরণ :

import org.hamcrest.CoreMatchers
import org.hamcrest.MatcherAssert
import org.junit.jupiter.api.Test

class HamcrestAssertionDemo {

    @Test
    fun assertWithHamcrestMatcher() {
        val subClass = SubClass()
        MatcherAssert.assertThat(subClass, CoreMatchers.instanceOf<Any>(BaseClass::class.java))
    }

}

উদাহরণস্বরূপ AssertJ :

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

class AssertJDemo {

    @Test
    fun assertWithAssertJ() {
        val subClass = SubClass()
        assertThat(subClass).isInstanceOf(BaseClass::class.java)
    }

}

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