ইনটেলিজজে 10.5-এ পরীক্ষা চলাকালীন "NoSuchMethodError: org.hamcrest.Matcher.describeMismatch" পাওয়া


233

আমি JUnit-Dep 4.10 এবং Hamcrest 1.3.RC2 ব্যবহার করছি।

আমি একটি কাস্টম ম্যাচার তৈরি করেছি যা নিম্নলিখিতগুলির মতো দেখাচ্ছে:

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)

আমার অনুমান যে এটি হ্যামক্রাস্টটি ভুল ব্যবহার করছে at ম্যাচারআসর্ট। আমি কীভাবে হ্যামক্রেস্ট.ম্যাচারআসার্ট ব্যবহার করছি তা আবিষ্কার করব (অর্থাত্ এটি হ্যামক্রাস্টের জন্য কোন জার ফাইলটি ব্যবহার করছে? ম্যাচচারআসর্ট)? এএএএএফসিটি, আমার ক্লাসপথের একমাত্র হামকারেষ্ট জারগুলি 1.3.RC2।

ইন্টেলিজ আইডিইএ এটি কি ইউনাইট বা হ্যামক্রস্টের নিজস্ব অনুলিপি ব্যবহার করছে?

আমি কীভাবে চালিত ক্লাইস্প্পটিকে আউটপুট করব যা ইন্টেলিজ ব্যবহার করে?

উত্তর:


272

নিশ্চিত করুন hamcrest বয়াম আপনার চেয়ে আমদানি অর্ডার বেশি JUnit বয়াম।

JUnit তার নিজস্ব org.hamcrest.Matcherক্লাস নিয়ে আসে যা সম্ভবত পরিবর্তে ব্যবহৃত হচ্ছে।

আপনি হ্যামক্রাস্টের ক্লাস ছাড়াই জুনিট-ডিপ-৪.১০.জার ডাউনলোড ও ব্যবহার করতে পারেন যা জুনিয়ট।

মকিতোতে এটিতে হ্যামকার্স্ট ক্লাসগুলিও রয়েছে, সুতরাং আপনার স্থানান্তরিত করতে হবে - এটি আবারও পুনরায় অর্ডার করতে হবে


1
ওপি জানিয়েছে যে তারা ইতিমধ্যে '-ডেপ' জারটি ব্যবহার করছে। তবে আপনার অনুমান যে এটি জুনিত জার থেকে ম্যাচার ক্লাসটি ব্যবহার করছে তা সঠিক শোনাচ্ছে। সুতরাং এটি সম্ভবত যে IDE তার নিজস্ব JUnit অনুলিপি ব্যবহার করছে।
ম্যাট্রিক্সফ্রোগ

2
আমি ইন্টেলিজের জুনিট.জার এবং জুনিট -৪.৮.জারের অনুলিপিটি সরিয়েছি, ইন্টেলিজের লাইব / ডিরেক্টরিতে জুনিট-ডিপ-৪.১০.জার ইনস্টল করেছি এবং এখনও সমস্যাটি দেখা দেয়।
নোয়েল ইয়াপ

8
JUnit 4.11 Hamcrest 1.3 সঙ্গে সামঞ্জস্যপূর্ণ এবং JUnit 4.10 Hamcrest 1.1 সঙ্গে সামঞ্জস্যপূর্ণ search.maven.org/remotecontent?filepath=junit/junit-dep/4.10/...
মুথু

23
নিশ্চিত করুন যে আপনি মকিটো-অল ব্যবহার করছেন না, বরং হ্যাকক্রিটকে বাদ দিয়ে মকিতো-কোর করুন
উলফ লিন্ডব্যাক

1
অফিসে সন্ধ্যা :33:৩৩ বাজে আমি একটি গুরুত্বপূর্ণ বৈশিষ্ট্যে কাজ করছি যা অবকাশে বেরোনোর ​​আগে অবশ্যই আমাকে সরবরাহ করা উচিত এবং এটি শুক্রবার, আমি পরের সপ্তাহে এই ছুটিতে আছি !!!!!! এখন এই ত্রুটি আমি কীভাবে পেতে পারি !!!
আদেলিন

170

আপনার শ্রেণীর পথে মকিতো-সমস্ত থাকলেই এই সমস্যাটি দেখা দেয় , যা ইতিমধ্যে অবহেলিত

সম্ভব হলে কেবল মকিতো-কোর অন্তর্ভুক্ত করুন ।

জুনিট, মকিতো এবং হ্যামক্রেষ্টের মিশ্রণের জন্য ম্যাভেন কনফিগারেশন:

<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>

2
একেবারে নতুন সংস্করণ হিসাবে মকিতো হ্যামক্রাস্টের সাথে পাওয়ারওমকের সাথেও সমান!
টম পারকিনসন

3
এটিকে কি মকিতো-অলটির পরিবর্তে মকিতো-কোর হওয়া উচিত?
ব্যবহারকারী 944849

3
উপরের সমস্ত ক্ষেত্রে কাজ করা উচিত তবে আপনার কেবলমাত্র সমস্ত গতির প্রয়োজন হলে আপনি কেবল মূলটি অন্তর্ভুক্ত করতে পারেন। নির্ভরতার ক্রমটি অগ্রাধিকারের ক্রমে শীর্ষ থেকে শুরু হওয়া গুরুত্বপূর্ণ বিট এমভিএন 3।
টম পারকিনসন

3
আপনাকে মকিতো-সমস্ত অন্তর্ভুক্ত করা উচিত নয় কারণ এর মধ্যে হামক্রেস্ট ১.১ অন্তর্ভুক্ত রয়েছে, পরিবর্তে মকিতো-কোর অন্তর্ভুক্ত করুন এবং এটি থেকে হ্যান্সারেস্টকে বাদ দিন (যা আপনি সকলের থেকে করতে পারবেন না)
উলফ লিন্ডব্যাক

1
"যদি সম্ভব হয় তবে মকিতো-কোর অন্তর্ভুক্ত করুন"। ঠিক আছে, তাহলে কেন এই উত্তর এখনও মকিতো-সমস্ত ব্যবহার করে?
স্টিলথ রাব্বি

60

সমস্যাটি ছিল ভুল hamcrest.Matcher, নাhamcrest.MatcherAssert ভুলটি ছিল , শ্রেণিটি ব্যবহৃত হচ্ছিল। এটি জুনিট -৪.৮ নির্ভরতা থেকে টেনে আনা যাচ্ছিল আমার নির্ভরতাগুলির একটি উল্লেখ করে।

পরীক্ষার সময় কোন উত্স থেকে নির্ভরতা (এবং সংস্করণগুলি) অন্তর্ভুক্ত তা দেখতে, চালনা করুন:

mvn dependency:tree -Dscope=test

5
আমারো একই ইস্যু ছিল. আমি জুনিট-ডিপ এবং হ্যামক্রেস্ট-কোর ব্যবহার করছিলাম তবে আমার আগে পামে পাওয়ারমক তালিকাভুক্ত ছিল যার ফলস্বরূপ জুনিট-জুনিট-হ্যামক্রাস্টের আগে জুনিটকে অন্তর্ভুক্ত করা হয়েছিল।
জন বি

9
এছাড়াও মকিতো-সমস্ত কিছু হ্যামক্রস্ট ক্লাস অন্তর্ভুক্ত। মকিতো-কোর ব্যবহার করা এবং হ্যামক্রস্ট নির্ভরতা বাদ দেওয়া আরও ভাল।
ব্রম্বো

3
ঠিক ঠিক একই সমস্যা নিয়ে হোঁচট খেয়েছি। সলিউশন জুনিট সংস্করণটি ৪.১১ এ উন্নীত করছে যা হ্যামক্রেষ্ট ১.৩
r3mbol এর

তাদের জন্য যেখানে সমস্ত পরামর্শ একই সাথে কাজ করে না (নির্ভরতা আদেশ, বহিষ্কার, এর -allসাথে প্রতিস্থাপন অপসারণ -coreইত্যাদি ...): আমাকে হ্যামস্কেস্টটি 1.1 সংস্করণে ফিরে যেতে হয়েছিল এবং এখন সবকিছু আবার কাজ করে।
ফেলিক্স হ্যাগস্পিল

1
আমার জন্য এটা কাজ করে যখন আমি আমার আমদানি পরিবর্তিত import static org.mockito.Matchers.anyString;থেকেimport static org.mockito.ArgumentMatchers.anyString;
শ্রীকান্ত প্রভু

28

নিম্নলিখিতটি আজ সবচেয়ে সঠিক হওয়া উচিত। দ্রষ্টব্য, জুনিট ৪.১১ হ্যামকারেস্ট-কোরের উপর নির্ভর করে, সুতরাং আপনাকে নির্দিষ্ট করে বলার দরকার নেই যে, ম্যাকিটো-অল ব্যবহার করা যাবে না কারণ এতে হ্যামকারেস্ট ১.১ অন্তর্ভুক্ত রয়েছে (এর উপর নির্ভর করে না)

<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.10.8</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3
নোট করুন যে JUnit 4.12 এখন হ্যামক্রাস্ট-কোর 1.3 এর উপর নির্ভর করে।
জিবিবি

mockito-allআমার সাহায্য থেকে বাদ , না mockito-corepom.xmlকাজের ক্ষেত্রে মকিতোর আগে হামক্রস্ট ঘোষণা করা ।
কিরিল

13

এটি কিছুটা লড়াই করার পরে আমার পক্ষে কাজ করেছিল

<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>

আমার জন্যও একই. এই ক্রমের উপর নির্ভরশীলতা স্থাপন মেনকে ট্রানজিটিভ ডিপগুলি সঠিকভাবে সমাধান করতে সহায়তা করে। মকিতো-কোর বা মকিতো-থেকে হ্যামক্রাস্টকে স্পষ্টভাবে বাদ দেওয়া আরও নিরাপদ হতে পারে, যদি কেউ আপনার পোমের ডিপগুলি পুনরায় অর্ডার করে।
মাদুর

4

চেষ্টা

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

পরিবর্তে

expectMessage(message)

ExpectedExceptionকোড মোড়ানোর জন্য আপনি একটি কাস্টম বা ইউটিলিটি পদ্ধতি লিখতে পারেন ।


4

আমি জানি এটি একটি পুরানো থ্রেড তবে আমার সমস্যার সমাধানটি আমার বিল্ড.gradle ফাইলগুলিতে নিম্নলিখিতটি যুক্ত করছিল। ইতিমধ্যে উপরে বর্ণিত হিসাবে একটি সামঞ্জস্য সমস্যা আছেmockito-all

সম্ভবত দরকারী পোস্ট :

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'

1

এটি একটি খুব পুরানো প্রশ্ন এবং সম্ভবত পূর্বনির্ধারিত ধারণাগুলি অনেকগুলি অনেক সমস্যার সমাধান করেছে তা সত্ত্বেও, আমি এখনও আমার সমস্যাটি স্থির করে এমন সম্প্রদায়ের সাথে সমাধানটি ভাগ করতে চাই।

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

এবং এটি সমস্যার দিকে পরিচালিত করে।

একরকম, ম্যাচারদের লং টাইপের মানগুলির সাথে সমস্যা রয়েছে। (আমি এতটুকু আইডিকে জুনিট বা রেস্ট-অ্যাসোরেড ব্যবহার করি না exactly ঠিক তাই, তবে আমি অনুমান করি যে ফিরে আসা জেএসওন-ডেটাতে কেবল পূর্ণসংখ্যা রয়েছে))

সমস্যাটি সমাধান করতে আমি যা করেছি তা হ'ল নিম্নলিখিত। পরিবর্তে ব্যবহার করুন:

long ID = ...;

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

আপনাকে কেবল পূর্ণসংখ্যায় কাস্ট করতে হবে। সুতরাং ওয়ার্কিং কোডটি এরকম দেখাচ্ছে:

long ID = ...;

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

এটি সম্ভবত সেরা সমাধান নয়, তবে আমি কেবল উল্লেখ করতে চেয়েছিলাম যে ভুল / অজানা তথ্যের ধরণের কারণেও ব্যতিক্রমটি ছুঁড়ে দেওয়া যেতে পারে।


0

আমার জন্য যা কাজ করেছিল তা হানক্রস্ট গ্রুপকে জুনিট পরীক্ষার সংকলন থেকে বাদ দিয়েছিল।

আমার বিল্ড.gradle এর কোডটি এখানে:

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

আপনি যদি ইন্টেলিজ চালিয়ে যাচ্ছেন তবে আপনাকে gradle cleanIdea idea clean buildআবার নির্ভরতাগুলি সনাক্ত করতে চালানোর দরকার হতে পারে ।


0

আমি জানি এটি সর্বোত্তম উত্তর নয় তবে আপনি যদি ক্লাসপথটি কাজ করতে না পারেন তবে এটি পরিকল্পনা বি সমাধান।

আমার পরীক্ষার ক্লাসপথে, আমি বর্ণনাটি মিসমাচ পদ্ধতির জন্য একটি ডিফল্ট প্রয়োগের সাথে নিম্নলিখিত ইন্টারফেস যুক্ত করেছি added

package org.hamcrest;

/**
 * PATCH because there's something wrong with the classpath. Hamcrest should be higher than Mockito so that the BaseMatcher
 * implements the describeMismatch method, but it doesn't work for me. 
 */
public interface Matcher<T> extends SelfDescribing {

    boolean matches(Object item);

    default void describeMismatch(Object item, Description mismatchDescription) {
        mismatchDescription.appendDescriptionOf(this).appendValue(item);
    }

    @Deprecated
    void _dont_implement_Matcher___instead_extend_BaseMatcher_();
}

0

আমার একটি গ্রেড প্রকল্প রয়েছে এবং যখন আমার বিল্ড.gradle নির্ভরতা বিভাগটি এর মতো দেখায়:

dependencies {
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'

    testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
    testImplementation 'junit:junit:4.12'
//    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'

    compileOnly 'org.projectlombok:lombok:1.18.4'
    apt 'org.projectlombok:lombok:1.18.4'
}

এটি এই ব্যতিক্রম বাড়ে:

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)

এই সমস্যাটি সমাধান করতে, আমি "মকিতো-কোর" "মকিতো-কোর" দিয়ে প্রতিস্থাপিত করেছি।

dependencies {
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'

//    testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
    testImplementation 'junit:junit:4.12'
    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'

    compileOnly 'org.projectlombok:lombok:1.18.4'
    apt 'org.projectlombok:lombok:1.18.4'
}

মকিতো-অল এবং মকিতো-কোরের মধ্যে ব্যাখ্যাটি এখানে পাওয়া যাবে: https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito বাইরের-ইন-mavengradle ভিত্তিক-প্রকল্প /

মকিতো-অল.জার ছাড়াও মকিতো নিজেও রয়েছে (১.৯.৫ হিসাবে) দুটি নির্ভরতা: হ্যামক্রেষ্ট এবং ওবজেনেসিস (আসুন এক মুহুর্তের জন্য পুনরায় প্যাকেজড এএসএম এবং সিজিবিআইবি বাদ দিন)। ক্লাসপাথে রাখার জন্য একটি জার ভিতরে যা প্রয়োজন তা হ'ল কারণ ছিল। এটি দেখতে অদ্ভুত লাগতে পারে তবে দয়া করে মনে রাখবেন যে মকিতো বিকাশ সেই সময়ের মধ্যে শুরু হয়েছিল যখন খাঁটি পিঁপড়া (নির্ভরতা পরিচালন না করে) সর্বাধিক জনপ্রিয় বিল্ড সিস্টেম ছিল জাভা প্রকল্পগুলির জন্য এবং কোনও প্রকল্পের জন্য প্রয়োজনীয় সমস্ত বাহ্যিক জেআর (যেমন আমাদের প্রকল্পের নির্ভরতা এবং তাদের নির্ভরতা) ছিল ম্যানুয়ালি ডাউনলোড করতে হবে এবং একটি বিল্ড স্ক্রিপ্টে নির্দিষ্ট করতে হবে।

অন্যদিকে মকিতো-কোর.জারটি হ'ল মকিতো ক্লাস (এছাড়াও পুনরায় পঠিত এএসএম এবং সিজিএলআইবি সহ)। মাভেন বা গ্রেডল প্রয়োজনীয় নির্ভরতাগুলির সাথে এটি ব্যবহার করার সময় (হ্যামক্রাস্ট এবং ওবজিনিসিস) সেই সরঞ্জামগুলি দ্বারা পরিচালিত হয় (স্বয়ংক্রিয়ভাবে ডাউনলোড হয় এবং একটি পরীক্ষার শ্রেণিবদ্ধ করে)। এটি ব্যবহৃত সংস্করণগুলিকে ওভাররাইড করার অনুমতি দেয় (উদাহরণস্বরূপ, যদি আমাদের প্রকল্পগুলি কখনই না, তবে পশ্চাদপটে সামঞ্জস্যপূর্ণ সংস্করণ ব্যবহার করে) তবে depend নির্ভরতাগুলি মকিতো-অল.জারের মধ্যে গোপন নয় যা নির্ভরতা বিশ্লেষণকারী সরঞ্জামগুলির সাথে সম্ভাব্য সংস্করণটির অসঙ্গতি সনাক্ত করতে দেয়। প্রকল্পে নির্ভরতা পরিচালিত সরঞ্জাম ব্যবহার করা হলে এটি আরও ভাল সমাধান।


0

আমার ক্ষেত্রে, আমাকে জুনিট-মদ থেকে একটি পুরানো হ্যামস্কেস্ট বাদ দিতে হয়েছিল:

<dependency>
  <groupId>org.junit.vintage</groupId>
  <artifactId>junit-vintage-engine</artifactId>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.hamcrest</groupId>
  <artifactId>hamcrest</artifactId>
  <version>2.1</version>
  <scope>test</scope>
</dependency>

0

এটি আমার পক্ষে কাজ করেছে। কিছু বাদ দেওয়ার দরকার নেই। আমি কেবল mockito-coreপরিবর্তে ব্যবহার করেছিmockito-all

testCompile 'junit:junit:4.12'
testCompile group: 'org.mockito', name: 'mockito-core', version: '3.0.0'
testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '2.1'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.