আপনি কীভাবে সংক্ষিপ্তভাবে Collectionউপাদানগুলির Setসাম্যতাটিকে দৃsert়তার সাথে দৃ ?়তার সাথে যুক্ত করবেন?
আপনি কীভাবে সংক্ষিপ্তভাবে Collectionউপাদানগুলির Setসাম্যতাটিকে দৃsert়তার সাথে দৃ ?়তার সাথে যুক্ত করবেন?
উত্তর:
আপনি দৃsert়ভাবে বলতে পারেন যে দুটি Setগুলি একে অপরের সমান, যা Set equals()পদ্ধতিটি নির্দেশ করে ।
public class SimpleTest {
private Set<String> setA;
private Set<String> setB;
@Before
public void setUp() {
setA = new HashSet<String>();
setA.add("Testing...");
setB = new HashSet<String>();
setB.add("Testing...");
}
@Test
public void testEqualSets() {
assertEquals( setA, setB );
}
}
এই @Testযদি দুটি পাস হবে Setগুলি একই আকারের হয় এবং একই উপাদান ধারণ করে।
equalsএবং hashCodeপ্রয়োগ করেছেন যা আপনি আপনার হ্যাশটেবলে সংরক্ষণ করছেন?
অ্যাপাচি আবারও উদ্ধার শুরু করে।
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
একটি যাদুমন্ত্র মত কাজ করে. আমি জানি না তবে আমি খুঁজে পেয়েছি যে সংগ্রহের সাথে নিম্নলিখিতগুলি assertEquals(coll1, coll2)সবসময় কাজ করে না। যে ক্ষেত্রে এটি আমার পক্ষে ব্যর্থ হয়েছিল সে ক্ষেত্রে আমার কাছে দুটি সেট সংগ্রহ ছিল সেটস দ্বারা সমর্থিত। হ্যামক্রস্ট বা জুনিট কেউই বলবে না যে সংগ্রহগুলি সমান ছিল যদিও আমি নিশ্চিত যে তারা ছিল। কালেকশন ইউটিস ব্যবহার করে এটি পুরোপুরি কার্যকর হয়।
সঙ্গে hamcrest :
assertThat(s1, is(s2));
সরল জোর দিয়ে:
assertEquals(s1, s2);
নোট: কংক্রিট সেট শ্রেণীর সমান () পদ্ধতি ব্যবহৃত হয়
আপনি যখন তুলনা করেন একটি বিশেষ আকর্ষণীয় কেস
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
এবং
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
এখনও অবধি, আমি দেখতে পাচ্ছি একমাত্র সমাধান হ'ল উভয়কে সেটগুলিতে পরিবর্তন করা
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
বা আমি উপাদান দ্বারা তাদের উপাদান তুলনা করতে পারে।
অ্যারে ভিত্তিক একটি অতিরিক্ত পদ্ধতি হিসাবে ... আপনি জুনিটেক্সে আনর্ডারড অ্যারে সংস্থানগুলি ব্যবহার করে বিবেচনা করতে পারেন। যদিও অ্যাপাচি কালেকশন ইউটিলেস উদাহরণটি কাজ করবে, সেখানে দৃ solid় দৃser় এক্সটেনশানগুলির একটি প্যাকও রয়েছে:
আমি মনে করি যে
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
আপনার কাছে অ্যাপ্রোচ অনেক বেশি পঠনযোগ্য এবং ডিবাগযোগ্য হবে (সমস্ত সংগ্রহ অ্যারিতে () সমর্থন করে, সুতরাং অ্যারেআসর্ট পদ্ধতিগুলি ব্যবহার করা যথেষ্ট সহজ হওয়া উচিত।
অবশ্যই এখানে খারাপ দিকটি হ'ল, জুনিটেক্স হ'ল একটি অতিরিক্ত জার ফাইল বা মাভেন এন্ট্রি ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
এই নিবন্ধটি পরীক্ষা করুন । সেখান থেকে একটি উদাহরণ:
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
হামক্রস্ট ব্যবহার:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
এটিতেও কার্যকর হয় যখন সেটগুলিতে আলাদা আলাদা ডেটাটাইপ থাকে এবং কেবল ব্যর্থ হওয়ার পরিবর্তে পার্থক্যের প্রতিবেদন দেয়।
আপনি যদি তালিকা বা সেটটিতে নির্দিষ্ট মানগুলির একটি সেট (ইতিমধ্যে বিদ্যমান সংগ্রহের সাথে তুলনা করার পরিবর্তে) অন্তর্ভুক্ত করে কিনা তা পরীক্ষা করে দেখতে চান তবে প্রায়শই সংগ্রহের টস্ট্রিং পদ্ধতিটি কার্যকর:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
এটি প্রথমে প্রত্যাশিত সংগ্রহটি নির্মাণ করা এবং এটি প্রকৃত সংগ্রহের সাথে তুলনা করার চেয়ে কিছুটা খাটো এবং লিখতে এবং সঠিক করা সহজ।
(স্বীকারোক্তি হিসাবে, এটি একটি বিশেষভাবে পরিষ্কার পদ্ধতি নয় এবং এটি "foo", "বার" দুটি উপাদান "foo" এবং "বার" থেকে কোনও উপাদানকে আলাদা করতে পারে না But তবে অনুশীলনে আমি মনে করি এটি পরীক্ষা করা সবচেয়ে সহজ এবং দ্রুত অন্যথায় অনেকগুলি বিকাশকারীকে চাপ দেওয়া ছাড়া হবে না))
আমি হান্স-পিটার স্টার এর সমাধানটি পছন্দ করি ... তবে আমি মনে করি এটি বেশ সঠিক নয়। দুর্ভাগ্যক্রমে তুলনা করার জন্য containsInAnyOrderএকটি Collectionঅ্যাজেটেস্ক গ্রহণ করে না । সুতরাং এটি একটি Collectionএর হতে হবে Matcher:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
আমদানি হ'ল:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;