java - IntelliJ 10.5 में परीक्षण चलाते समय "NoSuchMethodError: org.hamcrest.Matcher.describeMismatch" प्राप्त करना




junit intellij-idea (7)

इस तथ्य के बावजूद कि यह एक बहुत पुराना सवाल है और संभवतः कई पूर्ववर्ती विचारों में कई समस्याएं हल हुई हैं, मैं अभी भी उस समस्या के साथ समाधान साझा करना चाहता हूं जिसने मेरी समस्या तय की है।

मैंने पाया कि समस्या "हैटिम" नामक एक फ़ंक्शन था जिसे मैं जांचने के लिए उपयोग कर रहा था कि JSON-Array में कोई विशिष्ट आइटम है या नहीं। मेरे मामले में मैंने लंबे प्रकार के मूल्य की जांच की।

और इससे समस्या उत्पन्न हुई।

किसी भी तरह, मैचर्स को लंबे प्रकार के मूल्यों के साथ समस्याएं होती हैं। (मैं जुनीट या बाकी आश्वासन का इतना उपयोग नहीं करता हूं। बिल्कुल क्यों, लेकिन मुझे लगता है कि लौटा JSON-डेटा में केवल इंटीजर होते हैं।)

तो मैंने वास्तव में समस्या को ठीक करने के लिए क्या किया था निम्नलिखित था। के बजाय का उपयोग करने का:

long ID = ...;

...
.then().assertThat()
  .body("myArray", hasItem(ID));

आपको बस इंटीजर पर डालना होगा। तो कामकाजी कोड इस तरह दिखता था:

long ID = ...;

...
.then().assertThat()
  .body("myArray", hasItem((int) ID));

शायद यह सबसे अच्छा समाधान नहीं है, लेकिन मैं बस उल्लेख करना चाहता था कि गलत / अज्ञात डेटा प्रकारों के कारण अपवाद भी फेंक दिया जा सकता है।

मैं जुनीट-डीपी 4.10 और हैमक्रिस्ट 1.3.आरसी 2 का उपयोग कर रहा हूं।

मैंने एक कस्टम मैचर बनाया है जो निम्न जैसा दिखता है:

public static class MyMatcher extends TypeSafeMatcher<String> {
    @Override
    protected boolean matchesSafely(String s) {
        /* implementation */
    }

    @Override
    public void describeTo(Description description) {
        /* implementation */
    }

    @Override
    protected void describeMismatchSafely(String item, Description mismatchDescription) {

        /* implementation */
    }
}

चींटी का उपयोग करते हुए कमांड लाइन से चलाते समय यह पूरी तरह से ठीक काम करता है। लेकिन जब इंटेलिजे से भागते हैं, तो यह विफल रहता है:

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
    at com.netflix.build.MyTest.testmyStuff(MyTest.java:40)

मेरा अनुमान है कि यह गलत hamcrest का उपयोग कर रहा है। MatcherAssert। मुझे यह कैसे पता चलेगा कि कौन सा hamcrest.MatcherAssert इसका उपयोग कर रहा है (यानी कौन सा जार फ़ाइल यह हैमक्रिस्ट के लिए उपयोग कर रही है। मैचरएस्र्ट)? AFAICT, मेरे क्लासपाथ में एकमात्र हैमक्रिस्ट जार 1.3.आरसी 2 है।

IntelliJ IDEA JUnit या Hamcrest की अपनी प्रति का उपयोग कर रहा है?

मैं रनटाइम क्लासस्पैट को आउटपुट कैसे कर सकता हूं कि इंटेलिजे का उपयोग कर रहा है?


थोड़ा सा संघर्ष करने के बाद यह मेरे लिए काम किया

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
 </dependency>

 <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
 </dependency>

 <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
 </dependency>

प्रयत्न

expect(new ThrowableMessageMatcher(new StringContains(message)))

के बजाय

expectMessage(message)

आप कोड को लपेटने के लिए एक कस्टम ExpectedException या उपयोगिता विधि लिख सकते हैं।


मुझे पता है कि यह एक पुराना धागा है, लेकिन मेरे लिए इस मुद्दे को हल करने के लिए मेरे निर्माण .gradle फ़ाइलों में निम्नलिखित जोड़ रहा था। जैसा कि पहले से ही बताया गया है, mockito-all साथ एक संगतता मुद्दा है

संभवतः उपयोगी post :

testCompile ('junit:junit:4.12') {
    exclude group: 'org.hamcrest'
}
testCompile ('org.mockito:mockito-core:1.10.19') {
    exclude group: 'org.hamcrest'
}
testCompile 'org.hamcrest:hamcrest-core:1.3'

मेरे लिए क्या काम किया गया है जो जूनिट टेस्ट संकलन से हैमस्ट्रस्ट समूह को छोड़कर था।

मेरे build.gradle से कोड यहां दिया गया है:

testCompile ('junit:junit:4.11') {
    exclude group: 'org.hamcrest'
}

यदि आप IntelliJ चला रहे हैं तो आपको फिर से निर्भरता का पता लगाने के लिए gradle cleanIdea idea clean build चलाने की आवश्यकता हो सकती है।


यह समस्या तब भी उत्पन्न होती है जब आपके पास मॉकिटो होता है-सब आपके वर्ग पथ पर, जो पहले से ही बहिष्कृत है।

यदि संभव हो तो बस मॉकिटो-कोर शामिल करें

जूनिट, मॉकिटो और हैमक्रिस्ट मिश्रण के लिए मेवेन कॉन्फ़िगरेशन:

<dependencies>
  <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.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
</dependencies>

सुनिश्चित करें कि आपके जुनीट जार की तुलना में आयात आदेश पर हैमक्रिस्ट जार अधिक है।

org.hamcrest.Matcher अपने स्वयं के org.hamcrest.Matcher क्लास के साथ आता है जिसका शायद उपयोग किया जा रहा है।

आप जूनिट-डीपी -4.10.jar को भी डाउनलोड और उपयोग कर सकते हैं, जो कि बिना घुमावदार वर्गों के जुनीट है।

मॉकिटो में भी इसमें अवरोधक वर्ग हैं, इसलिए आपको इसे फिर से चलाने की आवश्यकता हो सकती है





hamcrest