JUnit और Hamcrest का एक साथ उपयोग कैसे करें?


88

मुझे समझ नहीं आ रहा है कि JUnit 4.8 को Hamcrest मैचर्स के साथ कैसे काम करना चाहिए। वहाँ कुछ matchers अंदर परिभाषित कर रहे हैं junit-4.8.jarमें org.hamcrest.CoreMatchers। उसी समय में कुछ अन्य मैचर्स hamcrest-all-1.1.jarहैं org.hamcrest.Matchers। तो, कहाँ जाना है? क्या मैं स्पष्ट रूप से परियोजना में हैमरेस्ट जार को शामिल करूंगा और जेयूनिट द्वारा उपलब्ध कराए गए मिलानकर्ताओं को अनदेखा करूंगा?

विशेष रूप से, मुझे empty()मैचर में दिलचस्पी है और इसे इनमें से किसी भी जार में नहीं पाया जा सकता है। मुझे कुछ और चाहिए? :)

और एक दार्शनिक सवाल: क्यों org.hamcrestजेयूनिट ने मूल हैमरेस्ट लाइब्रेरी का उपयोग करने के लिए हमें प्रोत्साहित करने के बजाय अपने स्वयं के वितरण में पैकेज शामिल किया?

जवाबों:


49

junit, AssertThat () नाम के नए चेक एस्टर तरीके प्रदान करता है, जो मिलानकर्ताओं का उपयोग करता है और अधिक पठनीय टेस्टकोड और बेहतर विफलता संदेश प्रदान करना चाहिए।

इसका उपयोग करने के लिए कनिष्ठ में कुछ मुख्य मिलानकर्ता शामिल हैं। आप बुनियादी परीक्षणों के लिए इनसे शुरुआत कर सकते हैं।

यदि आप अधिक मिलानकर्ताओं का उपयोग करना चाहते हैं, तो आप उन्हें स्वयं लिख सकते हैं या हैमरेस्ट लिब का उपयोग कर सकते हैं।

निम्न उदाहरण प्रदर्शित करता है कि एक ArrayList पर खाली मिलानकर्ता का उपयोग कैसे करें:

package com.test;

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

public class EmptyTest {
    @Test
    public void testIsEmpty() {
        List myList = new ArrayList();
        assertThat(myList, is(empty()));

    }
}

(मैंने अपने बिल्डपैथ में हैमरेस्ट-ऑल.जर को शामिल किया)


2
वास्तव org.hamcrest.Matchers.empty()में कहाँ स्थित है? क्या आप कृपया JAR फ़ाइल का लिंक दे सकते हैं?
16:25 पर yegor256

आप यहां सभी पा सकते हैं: code.google.com/p/hamcrest और हैमरेस्ट-all.jar का डाउनलोड यहां: code.google.com/p/hamcrest/downloads/…
cpater

1
ऐसा लगता है कि हैमक्रेस्ट 1.2 मैवेन सेंट्रल रिपॉजिटरी में नहीं है। यही वह समस्या है जिसका मैं सामना कर रहा हूँ :(
yegor256

5
Hamcrest 1.3 अब जारी किया गया है, और मावेन केंद्रीय में है।
टॉम


50

यदि आप 1.2 से अधिक या बराबर संस्करण वाले हैमरेस्ट का उपयोग कर रहे हैं, तो आपको इसका उपयोग करना चाहिए junit-dep.jar। इस जार में कोई हैमरेस्ट कक्षाएं नहीं हैं और इसलिए आप क्लास लोडिंग की समस्याओं से बचते हैं।

4.11 JUnit के बाद से junit.jarही कोई Hamcrest कक्षाएं नहीं हैं। अब और कोई जरूरत junit-dep.jarनहीं है।


2
ऐसा लगता है कि 4.12 JUnit के रूप में, अब एक junit-dep.jar नहीं है। क्या यह मामला है? और यदि हां, तो क्या हम स्टैंडअलोन हैमरेस्ट 1.3 जार का उपयोग करने के लिए हैं?
जेफ इवांस

1
दोनों सवालों के जवाब: हाँ।
स्टीफन बिर्कनर 21

25

आपके प्रश्न का सटीक उत्तर नहीं दे रहा है, लेकिन आपको FEST-Assert धाराप्रवाह दावे API की कोशिश जरूर करनी चाहिए । यह Hamcrest के साथ प्रतिस्पर्धा कर रहा है, लेकिन केवल एक स्थिर आयात के साथ बहुत आसान API की आवश्यकता है। यहाँ FEST का उपयोग करके cpater द्वारा प्रदान किया गया कोड है :

package com.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import static org.fest.assertions.Assertions.assertThat;

public class EmptyTest {
    @Test
    public void testIsEmpty() {
        List myList = new ArrayList();
        assertThat(myList).isEmpty();
    }  
}

संपादित करें: मावेन निर्देशांक:

<dependency>
  <groupId>org.easytesting</groupId>
  <artifactId>fest-assert</artifactId>
  <version>1.4</version>
  <scope>test</scope>
</dependency>

3
मैंने सिर्फ अपने दावे की लाइब्रेरी की अदला-बदली की। मैं हैमरेस्ट से काफी संतुष्ट था, लेकिन जूनियर समस्याग्रस्त समावेश सामग्री और टेस्ट लिखने में थोड़ी मेहनत (संग्रह और जेनरिक के साथ) के कारण, मुझे फेस्ट से प्यार है! साझा करने के लिए धन्यवाद।
गिलाउल

2
FEST अब सक्रिय नहीं है। AssertJ का उपयोग करें, जो कि FEST का एक कांटा है। joel-costigliola.github.io/assertj
user64141

17

इसके अलावा, अगर JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5 का उपयोग किया जा रहा है, तो सुनिश्चित करें कि मॉकिटो-सभी का उपयोग नहीं किया गया है। इसमें हैमरेस्ट कोर कक्षाएं शामिल हैं। इसकी जगह मॉकिटो-कोर का इस्तेमाल करें। नीचे विन्यास काम करता है:

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>hamcrest-core</artifactId>
            <groupId>org.hamcrest</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.1.1</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>hamcrest-core</artifactId>
            <groupId>org.hamcrest</groupId>
        </exclusion>
    </exclusions>
</dependency>

4

चूंकि संस्करण हर समय बदल रहे हैं, इसलिए मैं लोगों को यह बताने के लिए पोस्ट कर रहा हूं कि 2 दिसंबर 2014 तक, http://www.javacodegeeks.com/2014/03/how-to-test-d dependencies-in पर निर्देश -a-maven-project-junit-mockito-hamcrest-assertj.html ने मेरे लिए काम किया। मैंने AssertJ का उपयोग नहीं किया है, बस ये:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>1.9.5</version>
  <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-core</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>   
<dependency>
    <groupId>org.objenesis</groupId>
    <artifactId>objenesis</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>

1
एक ही समय में हैमरेस्ट-कोर और हैमरेस्ट-लाइब्रेरी निर्भरता दोनों को परिभाषित करने की आवश्यकता नहीं है, क्योंकि हैमरेस्ट-लाइब्रेरी पहले से ही हैमरेस्ट-कोर को एक सकर्मक निर्भरता के रूप में परिभाषित करता है।
यूजीन मेयसुक

3

क्यों JUnit ने अपने मूल वितरण में org.hamcrest पैकेज को शामिल करने के बजाय हमें मूल हैमरेस्ट लाइब्रेरी का उपयोग करने के लिए प्रोत्साहित किया?

मुझे लगता है कि क्योंकि वे assertThatJUnit का हिस्सा बनना चाहता था लगता है । तो इसका मतलब है कि Assertवर्ग को org.hamcrest.Matcherइंटरफ़ेस आयात करना होगा और यह तब तक नहीं हो सकता जब तक कि JUnit या तो Hamcrest पर निर्भर न हो, या इसमें (Hamcrest का कम से कम हिस्सा) शामिल न हो। और मुझे लगता है कि इसका कुछ हिस्सा आसान था, ताकि बिना किसी निर्भरता के JUnit प्रयोग करने योग्य हो।


2

2018 में अधिकांश आधुनिक पुस्तकालयों का उपयोग:

configurations {
    all {
        testCompile.exclude group: "org.hamcrest", module: "hamcrest-core"
        testCompile.exclude group: "org.hamcrest", module: "hamcrest-library"
    }
}
dependencies {
    testCompile("junit:junit:4.12")
    // testCompile("org.hamcrest:hamcrest-library:1.3")
    // testCompile("org.hamcrest:java-hamcrest:2.0.0.0")
    testCompile("org.hamcrest:hamcrest-junit:2.0.0.0")
}

0

JUnit-4.12 और JUnit-Dep-4.10 दोनों में संबंधित .xml फ़ाइलों के अनुसार Hamcrest निर्भरताएं हैं।

आगे की जांच से पता चलता है कि हालाँकि निर्भरता .xml फ़ाइलों में, स्रोत और कक्षाओं में जार में की गई थी। लगता है build.gradle में निर्भरता को बाहर करने का एक तरीका है ... यह सब कुछ साफ रखने के लिए परीक्षण करना।

बस एक फी


1
मुझे आपका दूसरा पैराग्राफ समझ नहीं आ रहा है। मुझे लगता है कि आप कुछ शब्द छोड़ गए होंगे जो आपके लिखने के लिए थे?
डैन गेट्ज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.