হামক্রস্ট সংগ্রহের তুলনা করুন


114

আমি 2 টি তালিকার তুলনা করার চেষ্টা করছি:

assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));

তবে ধারণা

java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>)
method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable
  (no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable
  (cannot instantiate from arguments because actual and formal argument lists differ in length)

আমি এটা কিভাবে লিখব?

উত্তর:


161

আপনি যদি এই দুটি তালিকা একইরূপে দাবি করতে চান তবে হ্যামক্রাস্টের সাথে জিনিসগুলিকে জটিল করবেন না:

assertEquals(expectedList, actual.getList());

যদি আপনি সত্যিই কোনও অর্ডার-সংবেদনশীল তুলনা সম্পাদন করতে চান, আপনি containsInAnyOrderভারার্গস পদ্ধতিতে কল করতে পারেন এবং সরাসরি মান প্রদান করতে পারেন :

assertThat(actual.getList(), containsInAnyOrder("item1", "item2"));

(ধরে নিচ্ছেন যে এই তালিকার Stringপরিবর্তে আপনার তালিকাটি রয়েছে Agent))

আপনি যদি সত্যই কোনও একই বিষয়টিকে একটি সামগ্রীর সাথে কল করতে চান List:

assertThat(actual.getList(), containsInAnyOrder(expectedList.toArray(new String[expectedList.size()]));

এই ছাড়া, আপনি একটি একক আর্গুমেন্ট সহ পদ্ধতি কলিং এবং একটি তৈরি করছেন Matcherযে আশা একটি মেলে Iterableযেখানে প্রতিটি উপাদান একটি হল List। এটি একটির সাথে মেলে ব্যবহার করা যাবে না List

এটি হ'ল আপনি একটি এর List<Agent>সাথে কোনওটির সাথে মেলে ধরতে পারবেন না Matcher<Iterable<List<Agent>>যা আপনার কোডটি চেষ্টা করছে।


"যদি আপনি সত্যিই কোনও তালিকার বিষয়বস্তু সহ একই পদ্ধতিতে কল করতে চান" এর জন্য +1। দুঃখের বিষয় আমি নিজেই সেটার সমাধান করতে পারিনি। বিশেষভাবে যে এখানে কোনও কনস্ট্রাক্টর রয়েছে যা সংগ্রহের জন্য নেয়।
ইয়াদ ইব্রাহিম

3
@ টিম বেশ নয়; containsInAnyOrderযে প্রয়োজন সব উপাদান উপস্থিত আছে, যাতে প্রথম কথন ব্যর্থ হবে। অন্তত সেই উপাদানগুলি উপস্থিত রয়েছে hasItemsকিনা তা আপনি পরীক্ষা করতে চান কিনা দেখুন ।
জো

4
আপনি যদি ইনঅর্ডার ব্যবহার করে থাকেন তবে আপনার প্রথমে নিশ্চিত হওয়া উচিত যে উভয় তালিকার একই আকার রয়েছে ... যদি actual.getList() এমনটি ঘটে থাকে "item1", "item3", "item2"তবে পরীক্ষাটি পাস হবে এবং সম্ভবত আপনি নিশ্চিত করতে চান যে এটিতে কেবল তালিকাভুক্ত আইটেম রয়েছে ... সেক্ষেত্রে আপনি ব্যবহার করতে পারেন assertThat(actual.getList().size(), equalTo(2));InAnyOrder ধারণাগুলির পূর্বে, আপনি উভয় তালিকার একই বিষয়বস্তু রয়েছে তা নিশ্চিত করুন।
মার্টিন

1
@ মার্টিন আপনি ভাবছেন hasItems । অতিরিক্ত চেক এখানে অপ্রয়োজনীয়। উপরের টিমের কাছে মন্তব্যটি দেখুন, এবং হ্যাকরেস্টের হ্যাশ আইটেমগুলি কীভাবে রয়েছে, এতে কোনও অ্যানআর্ডার কী আলাদা?
জো

1
কোটলিন ব্যবহারকারী : স্প্রেড অপারেটর যুক্ত করতে ভুলবেন না (*expectedList.toTypedArray() ভ্যারেজ হিসাবে কোনও অ্যারে পাস ) !
জেমস বোম্যান

62
List<Long> actual = Arrays.asList(1L, 2L);
List<Long> expected = Arrays.asList(2L, 1L);
assertThat(actual, containsInAnyOrder(expected.toArray()));

অপ্রয়োজনীয় পরামিতি ছাড়াই @ জো এর উত্তরের সংক্ষিপ্ত সংস্করণ।


28

@ জো এর উত্তর পরিপূরক:

হামক্রস্ট আপনাকে তালিকার সাথে মেলে তিনটি প্রধান পদ্ধতি সরবরাহ করে:

contains অর্ডার গণনা করে নেওয়া সমস্ত উপাদানগুলির সাথে মিলের জন্য চেক, তালিকায় যদি কম-বেশি উপাদান থাকে তবে এটি ব্যর্থ হবে

containsInAnyOrder সমস্ত উপাদানগুলির সাথে মেলে যাচাইয়ের জন্য পরীক্ষা করে এবং এটি অর্ডার বিবেচনা করে না, তালিকায় যদি কম বা কম উপাদান থাকে তবে ব্যর্থ হবে

hasItems কেবলমাত্র নির্দিষ্ট বস্তুর জন্য যাচাই করে তালিকায় আরও কিছু আছে কিনা তা বিবেচ্য নয়

hasItem কেবলমাত্র একটি অবজেক্টের জন্য যাচাই করে তালিকায় আরও কিছু আছে কিনা তা বিবেচ্য নয়

equalsএঁরা সকলেই অবজেক্টের একটি তালিকা পেতে পারেন এবং তুলনার জন্য পদ্ধতিটি ব্যবহার করতে পারেন বা উল্লিখিত @ বারজাবের মতো অন্যান্য ম্যাথচারগুলির সাথে মিশ্রিত হতে পারে:

assertThat(myList , contains(allOf(hasProperty("id", is(7L)), 
                                   hasProperty("name", is("testName1")),
                                   hasProperty("description", is("testDesc1"))),
                             allOf(hasProperty("id", is(11L)), 
                                   hasProperty("name", is("testName2")),
                                   hasProperty("description", is("testDesc2")))));

http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#contains (ই ...) http://hamcrest.org/ জাভাহ্যামক্রেস্ট / জাভাদোক / ১.৩/২০১ham / হ্যামক্রেস্ট / ম্যাচার্স এইচটিএমএল #containsInAnyOrder (java.util. Colલેક્શન) http://hamcrest.org/ javaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#has আইটেম ( টি ...)


পার্টিতে কিছুটা দেরি, তবে প্রতিটি পদ্ধতির মধ্যে পার্থক্য বর্ণনা করার জন্য ধন্যবাদ।
মার্কোস ডি আন্দ্রেড

কেস তালিকার আইটেমগুলির ক্ষেত্রে দুর্দান্ত সিদ্ধান্ত আদিম ধরণের নয়।
স্ট্যানিস্লাভ তেসপা

এটি করার কোনও ধরণের নিরাপদ উপায় আছে?
19

15

বিদ্যমান হ্যামক্রেস্ট লাইব্রেরিগুলির সাথে (v.2.0.0.0 হিসাবে) আপনার সংগ্রহগুলিতে সংগ্রহ.toArray () পদ্ধতি ব্যবহার করতে বাধ্য করা হয়েছে যাতে ইনঅর্ডার ম্যাচারের রয়েছে। খুব ভাল এটি org.hamcrest.Matchers এ একটি পৃথক পদ্ধতি হিসাবে যুক্ত করা হবে at

public static <T> org.hamcrest.Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(Collection<T> items) {
    return org.hamcrest.collection.IsIterableContainingInAnyOrder.<T>containsInAnyOrder((T[]) items.toArray());
}

আসলে আমি আমার কাস্টম পরীক্ষা লাইব্রেরিতে এই পদ্ধতিটি যুক্ত করে শেষ করেছি এবং এটি আমার পরীক্ষার কেসগুলির পাঠযোগ্যতা বাড়াতে (কম ভার্বোসটির কারণে) বাড়ানোর জন্য ব্যবহার করি।


2
খুব ভাল, আমি এই সহায়কটি ব্যবহার করব। এখানে দৃ message় বার্তাটি আরও তথ্যবহুল: এটি অনুপস্থিত আইটেমগুলির একের পর এক নাম রাখে: কেবলমাত্র তালিকাটি এলেম 1, এলেম 2, .. এলিএম 99 হওয়া উচিত, তবে আমি এলেম 1, এলেম 2, ..., এলিম98 - সৌভাগ্য কামনা করছি নিখোঁজ এক খুঁজে।
pihentagy

3

নিশ্চিত করুন যে করুন Objectআপনার তালিকায় গুলি আছে equals()তাদের উপর সংজ্ঞায়িত। তারপর

    assertThat(generatedList,is(equalTo(expectedList)));

কাজ করে।


1

অবজেক্টের তালিকার জন্য আপনার এর মতো কিছু হতে পারে:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
import static org.hamcrest.Matchers.is;

@Test
@SuppressWarnings("unchecked")
public void test_returnsList(){

    arrange();
  
    List<MyBean> myList = act();
    
    assertThat(myList , contains(allOf(hasProperty("id",          is(7L)), 
                                       hasProperty("name",        is("testName1")),
                                       hasProperty("description", is("testDesc1"))),
                                 allOf(hasProperty("id",          is(11L)), 
                                       hasProperty("name",        is("testName2")),
                                       hasProperty("description", is("testDesc2")))));
}

যদি আপনি অবজেক্টগুলির ক্রম পরীক্ষা করতে না চান তবে অন্তর্ভুক্তআইঅনআর্ডার ব্যবহার করুন ।

পিএস যে সতর্কতাটি সরবরাহ করা হয় তা এড়াতে কোনও সহায়তা সত্যিই প্রশংসা করা হবে।


-3

অর্ডার সংরক্ষিত ব্যবহারের সাথে দুটি তালিকার তুলনা করতে,

assertThat(actualList, contains("item1","item2"));

এটি প্রশ্নের উত্তর দেয় না।
কামস্কাক

এটি আংশিকভাবে করে।
rvazquezglez

@rvazquezglez আপনার অর্থ কি? তুমি কেন এটা বললে? পদ্ধতির ফলাফলটি আমার পরিবেশে সঠিক।
নিয়াওমিজিয়ান

@ নায়োমজিংজিয়ান কোডটি যাচাই করছে যে actualListএতে containsম্যাচারের অভ্যন্তরের উপাদান রয়েছে , যা উপাদানগুলি একই ক্রমে না থাকলে এবং ব্যর্থ হবে যদি এতে আরও উপাদান থাকে বা একটি অনুপস্থিত থাকে তবে তা ব্যর্থ হবে।
rvazquezglez

@rvazquezglez সুতরাং কোডের উদ্দেশ্যটি হ'ল দুটি তালিকায় সঠিক সমতা (একই দৈর্ঘ্য, মান এবং ক্রম) পরীক্ষা করা, তাই না?
নিয়াওমিজিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.