एक वस्तु को मुखर करना एक विशिष्ट प्रकार है


195

क्या यह संभव है JUnit में किसी वस्तु का जोर लगाना एक वर्ग का एक उदाहरण है? विभिन्न कारणों से मेरे पास मेरे परीक्षण में एक वस्तु है जिसे मैं टाइप करना चाहता हूं। क्या यह Object1 का एक प्रकार है या Object2 का एक प्रकार?

वर्तमान में मेरे पास है:

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

यह काम करता है लेकिन मैं सोच रहा था कि क्या ऐसा करने का अधिक स्पष्ट तरीका है।

उदाहरण के लिए कुछ इस तरह:

assertObjectIsClass(myObject, Object1);

मैं ऐसा कर सकता था:

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

क्या कोई विशिष्ट मुखर विधि है जो मुझे किसी वस्तु के प्रकार को अधिक सुरुचिपूर्ण, तरल तरीके से जांचने की अनुमति देती है?


15
क्या आप जानते हैं कि assertTrue(myObject instanceof Object1);और assertEquals(myObject.class, Object1.getClass());वास्तव में अलग-अलग परीक्षण हैं? पहले myObject को उप-वर्ग के उदाहरण के रूप में स्वीकार करता है Object1, बाद में नहीं।
Erich Kitzmueller

@ammoQ बहुत अच्छा बिंदु। मैंने उपवर्गों के बारे में नहीं सोचा। Clarifaction के लिए धन्यवाद
RNJ

1
जैसा कि माबा बताते हैं, Hamcrest का उपयोग करने पर विचार करें। यह सिर्फ इतना है कि आप एक बेहतर काम कर रहे परीक्षण है। Hamcrest भी मानक की तुलना में विफलता के बहुत बेहतर लॉगिंग प्रदान करता है assertTrueassertTrueबस कहेंगे expected true got false, हैमरेस्ट कहेंगेexpected instanced of XYZ, got instance of ABC
जॉन बी

जवाबों:


253

आप assertThatविधि और माचिस का उपयोग कर सकते हैं जो JUnit के साथ आता है।

इस लिंक पर एक नज़र डालें जो JUnit Matchers के बारे में थोड़ा सा वर्णन करता है।

उदाहरण:

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

4
: यहाँ Matcher के लिए लिंक इस्तेमाल किया जा रहा है hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/...
जॉन बी

3
FYI करें, MatcherAssert.assertThat, Assert.assertThat की तुलना में बेहतर व्यवहार करता है (त्रुटियों के मामले में बेहतर लॉगिंग प्रदान करता है)। मैं इसके बजाय इसका उपयोग करने की सलाह देता हूं। hamcrest.org/Java Hamcrest
John B

13
यह एक तुच्छ दावा है और उदाहरण में सच नहीं होने पर एक संकलन त्रुटि होगी! आमतौर पर आप वर्ग पदानुक्रम के साथ नीचे जाना चाहते हैं instanceof: BaseClass subClass = new SubClass(); assertThat(subClass, isA(SubClass.class));लेकिन यह संकलित नहीं है क्योंकि SubClassऐसा नहीं है ? super BaseClass
TWStStrrob

3
@TWiStErRob मुझे समझ नहीं आता कि तुम क्या यहाँ कहने के लिए ... बदलने की कोशिश की कोशिश कर रहे instanceOf(BaseClass.class)करने के लिए instanceOf(String.class)और आप देखेंगे कि यह ठीक संकलन लेकिन एक AssertionError फेंक दिया होगा।
माबा

1
@ माबा, वह किसी कारण से isA के बारे में बात कर रहा है, जो वर्ग को पकड़ता है, वह Class<T>इसके बजाय स्वीकार करता है Class<?>(जो कि उदाहरण के लिए है)। चूंकि यह कक्षा को पकड़ता है, इसलिए यह उदाहरण के लिए असंगत कक्षा के साथ isA करने के लिए एक संकलन समय त्रुटि होगी। github.com/hamcrest/Java Hamcrest
Vsevolod Golovanov

46

चूँकि assertThatपुराना उत्तर था, अब उसे निकाल दिया गया है, मैं सही समाधान पोस्ट कर रहा हूँ:

assertTrue(objectUnderTest instanceof TargetObject);


2
अगर ObjectUnderTest TargetObject का उपवर्ग है, तो यह अभी भी trueसही परिणाम देगा ? और मुझे लगता है कि आप वास्तविक प्रकार का परीक्षण करना चाहते हैं।
एरिका

मुझे लगता है कि यह सही उत्तर नहीं है। मूल प्रश्न कुछ ऐसा पूछ रहा था जो विशेष रूप से वस्तु के सटीक प्रकार पर जाँच करता है। यह समाधान ऐसा नहीं है (जैसा कि ऊपर @EircG द्वारा उल्लेख किया गया है) और यह मूल रूप से उपयोगकर्ता द्वारा प्रश्न देने के लिए भी प्रदान किया गया है, इसलिए निश्चित रूप से "सही" उत्तर imo नहीं है। सही उत्तर के लिए, फ्रैंकलिन यू उत्तर की जाँच करें।
kekko12

खैर, यह नकारात्मक पहलू है जिसका @EricG ने उल्लेख किया है, फ्रेंकलिन के जवाब के बारे में - मैंने बस इसे देखा, और यह मेरे लिए समझ में नहीं आया इसलिए मैंने सिर्फ Junit5 के साथ अपने प्रोजेक्ट में परीक्षण किया - यह गलत है !! Instof के लिए ऐसा कोई सिंटैक्स नहीं है, न ही InstanceOf नाम की कोई विधि! वह पूरी तरह से गलत है। मैं अभी भी अपने जवाब के साथ खड़ा हूं, और जैसा कि इसका सबूत है, यह कम से कम 30 लोगों के लिए सहायक था जिन्होंने इसे उखाड़ फेंका! (मुझे लगता है आप नीचा दिखाया गया है)।
Carmageddon

@ kekko12 मेरा उत्तर सटीक प्रकार की जाँच नहीं करता है; यह इस उत्तर के समान उपवर्ग स्वीकार करता है। मैंने इसे संबोधित करने के लिए अपना उत्तर अपडेट कर दिया है; खेद है कि मैंने इस प्रश्न पर ध्यान नहीं दिया। मुझे लगता है कि सटीक समानता ज्यादातर मुखर पुस्तकालय में शामिल नहीं है क्योंकि यह अक्सर उपयोग नहीं किया जाता है।
फ्रेंकलिन यू

@Carmageddon फ्रेंकलिन यू का जवाब ठीक काम करता है यदि आप हैमरेस्ट एसेर्शन आयात का उपयोग करते हैं: `` स्थैतिक org.hamcrest.CoreMatchers.instanceOf आयात करें; अपने कोड नमूने के अनुसार `` `एस.एस. मैं मानता हूं कि हालांकि मैंने फ्रैंकलिन के उत्तर की अनदेखी की और वास्तव में, ये 2 उत्तर कार्यात्मक रूप से समतुल्य हैं, इसलिए मुझे लगता है कि यह अंत में प्राथमिकता का विषय है।
kekko12

21

JUnit 5 के लिए समाधान

प्रलेखन कहता है:

हालाँकि, JUnit बृहस्पति की org.junit.jupiter.Assertionsकक्षा assertThat()JUnit 4 की org.junit.Assertकक्षा में पाए जाने वाले एक विधि की तरह प्रदान नहीं करती है जो हैमरेस्ट स्वीकार करती है Matcher। इसके बजाय, डेवलपर्स को तृतीय-पक्ष जोर पुस्तकालयों द्वारा प्रदान किए गए मिलान के लिए अंतर्निहित समर्थन का उपयोग करने के लिए प्रोत्साहित किया जाता है।

Hamcrest के लिए उदाहरण :

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()को हैमरेस्ट के लिए स्थगित कर दिया गया है, ताकि जुनीत तीसरे पक्ष के जोर पुस्तकालयों के साथ भी काम करे।
फ्रैंकलिन यू

मैंने सिर्फ इस उत्तर का परीक्षण किया, यह सही नहीं है और कई संकलन त्रुटियों की ओर जाता है: अभिव्यक्ति की अवैध शुरुआत, प्रकार की अवैध शुरुआत; ''; उम्मीद की जा रही है ... दूसरे शब्दों में, अपने दूसरे पैरामीटर के लिए माचिस की तीली से, "Instof (BaseClass.class)" नहीं हो सकता है! वास्तव में, आपने यह भी सही ढंग से टाइप नहीं किया, आपके द्वारा उपयोग किया गया वाक्यविन्यास थोड़ा अलग है - "InstanceOf (" - एक फ़ंक्शन कॉल! वास्तव में ऐसा कोई फ़ंक्शन नहीं है ... क्या यह किसी द्वारा भी परीक्षण किया गया था? यह मैन्युअल रूप से प्रतीत होता है किसी भी परीक्षण के बिना टाइप किया
Carmageddon

@Carmageddon मैंने दो उत्तर दिए, एक हैमरेस्ट के लिए और दूसरा AssertJ के लिए। आप किस के बारे में बात कर रहे हैं?
फ्रैंकलिन यू

@Carmageddon मुझे लगता है कि आप Hamcrest उदाहरण बारे में बात कर रहे हैं और आप को याद टाइप instanceOfके रूप में instanceof(मामले मन)। instanceOfहै एक समारोह है, जबकि instanceofहै एक जावा कीवर्ड
फ्रेंकलिन यू

मैं निश्चित रूप से Hamcrest एक करने के लिए भेजा है, और मैं दोनों एक ही कीवर्ड की कोशिश की और एक समारोह के रूप के बाद मैं thats देखा आप इसे कैसे लिखा था - ऐसी कोई समारोह नहीं है ...
Carmageddon

3

Kotlin के लिए JUnit 5 के लिए समाधान!

Hamcrest के लिए उदाहरण :

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
इस बहुत ही सुंदर मुखर समाधान के लिए धन्यवाद
नाइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.