AssertEquals, ro'yxat tarkibi tartibga solinmagan

Mahsulotlar har qanday tartibda qaytarilishi mumkin bo'lsa, quyidagilarni qanday qilib qayta ishlating?

List products = get_products("test_produc");
assertEquals(products.size(),3);
assertEquals(products.get(0).getName(), "test_product1");
assertEquals(products.get(1).getName(), "test_product2");
assertEquals(products.get(2).getName(), "test_produc3");

Agar oqimlardan oqilona foydalanish mumkin bo'lsa, unda men bunday takliflarni qabul qilaman. Hamcrest takliflari ham xush kelibsiz.

7
@ jpmc26 Menimcha bu bir xil savol emas.
qo'shib qo'ydi muallif Baz, manba
@Morvader Sizning etishmayotgan getName ()
qo'shib qo'ydi muallif Baz, manba
Shu kabi bir narsa: assertThat (actual, containsInAnyOrder (expected.toArray ()));
qo'shib qo'ydi muallif Morvader, manba
@Baz Sizga List natijasi har qanday tartibda muayyan elementlar majmuasini o'z ichiga olganligini qanday tasdiqlashni so'radingiz. Bu so'zma-so'z ravishda ikkita ro'yxatni tasdiqlash bilan bir xil narsalarni o'z ichiga oladi. Dunyoda bu savol qanday farq qiladi? Yaxshiyamki, bu savolning sabablari sizning muammoingizni hal qilmasligini tushuntiring. Chunki u erda javoblar to'liq bu savolni o'qiganimda yodda tutilgan echimlar. Siz haqiqatdan ham JUnit tashkil etilganidan beri ushbu muammolarga duch keladigan birinchi odam ekanligingizni o'ylaysizmi? Bu birlik testida sherik ; albatta mavjud post bo'lar edi.
qo'shib qo'ydi muallif jpmc26, manba
Menimcha, bu aniq dublikat emas. Savolda "oqimlar" haqida gapirilgandan so'ng, OP "ob'ektlar" ni ("getName ()" usuli bilan "Mahsulot" ob'ektini) "strings" (mahsulotlar nomlari) bilan taqqoslashni istaydi (ya'ni ochiq-oydin qo'ng'iroq qilmaslik) har bir ob'ektga getName() yana va yana savolning muhim bir qismi (?) ... Yoki shunday deb o'yladim! Agar bu savolda differensiator bo'lsa, @sruetti'dan javob hozirgi emas, balki javob sifatida tanlangan bo'lishi kerak ...
qo'shib qo'ydi muallif OzgurH, manba
@ Jpmc26 bilan rozi ekanman, shuni ta'kidlash kerakki, tenglik va buyurtma turli xil narsadir va ko'pchiligini ikki xil tenglik uchun "butunlay sindirilgan" deb hisoblasangiz, bir xil pozitsiyada turmaslik uchun, buyurtma berildi, lekin emas, teng, keyin tartiblash va taqqoslash buziladi. Haqiqatan ham, shu sababli ochiq to'siq taqqoslash qilish, albatta, huquqi echimidir va sizning maqsadingizni yaxshiroq ko'rsatadi (siz tartibga solmagan ma'lumotlar ya'ni to'siq)). Ushbu muqobil sizning ma'lumotlaringiz buyurtma berilishi mumkinligi haqidagi taxminni keltirib chiqaradi, bu sizni uzoq muddatda sizni tishlashi mumkin.
qo'shib qo'ydi muallif VisualMelon, manba

7 javoblar

Men AssertJ dan foydalanishni tavsiya qilaman -

import static org.assertj.core.api.Assertions.assertThat;

// ......

List products = get_products("test_produc").stream()
    .map(Product::getName)
    .collect(toList());

assertThat(products).containsExactlyInAnyOrder("Third", "Second", "First");

bu sizga qo'shimcha ravishda ravon bayonotlar beradi (ayniqsa, istisnolarni boshqarish ).

7
qo'shib qo'ydi

Eslatma: assertEquals shuningdek, ro'yxatlarda va to'g'ridan-to'g'ri o'rnatadi. Bu juda oz terish va juda aniq xato xabarlarini beradi.

Qaytish qiymatlari ikki nusxadagi ma'lumotlarga ega bo'lmasa, ular ro'yxat o'rniga to'siq qo'yish kerak. Viktorina qilayotgan funktsiyani o'zgartirsangiz, uni quyidagi tarzda sinab ko'rishingiz mumkin:

assertEquals(new HashSet<>(Arrays.asList("Item1", "Item2")), get_products());

Agar bu imkoniyat bo'lmasa, siz kutilgan va haqiqiy natijalarni saralashingiz va ularni taqqoslashingiz kerak:

asssertEquals(Arrays.sort(Arrays.asList("Item1", "Item2")), Arrays.sort(get_products()));

Nihoyat Hamcrest akkauntingizdan foydalanishga murojaat qilishingiz mumkin (funktsiya containsInAnyOrder org.hamcrest.collection.IsIterableContainingInAnyOrder ).

assertThat(get_products(), containsInAnyOrder("Item1", "Item2"));
7
qo'shib qo'ydi

I'd combine the answer of Abubakkar with Hamcrest compare collections

List productNames = products.stream()
                                    .map(p -> p.getName())
                                    .collect(Collectors.toList());
// assert that the actual list does not contain additional elements:
assertEquals(products.size(),3);
assertThat(productNames, containsInAnyOrder("test_product1", "test_product2", "test_produc3"));
3
qo'shib qo'ydi
Yo'q, asList emas
qo'shib qo'ydi muallif Baz, manba

Stream # anyMatch (Predicate filter) :

Ushbu oqimning elementlari taqdim etilgan ogohlantirishga mos kelishini beradi. Natijani aniqlash uchun zarur bo'lmasa, barcha elementlar bo'yicha taqqoslashni baholash mumkin emas. Agar oqim bo'sh bo'lsa, FALSE qaytariladi va oldindan baholanmaydi.

assertEquals(products.size(), 3);
assertTrue(products.stream().anyMatch(p -> "test_product1".equals(p.getName())));
assertTrue(products.stream().anyMatch(p -> "test_product2".equals(p.getName())));
assertTrue(products.stream().anyMatch(p -> "test_product3".equals(p.getName())));
2
qo'shib qo'ydi
Lekin nega? Aytishim mumkinki, bu to'plamdan foydalanishning foydasi yo'q. Agar bu juda muhim bo'lsa, siz hali ham ko'plikni aniqlay olmaysiz. Lineer (yoki linearitmik) vaqt o'rniga kvadratik vaqt talab etiladi. Bu juda aniqroq. Va boshqalar.
qo'shib qo'ydi muallif wchargin, manba

stream dan foydalangan holda shunga o'xshash biror narsani sinab ko'rishingiz mumkin (faqatgina getName bilan qiziqasiz deb o'ylayman va men hamcrest ishlatmadim, shuning uchun faqat assertTrue ):

List productNames = products.stream()
                                    .map(p -> p.getName())
                                    .collect(Collectors.toList());

assertTrue(productNames.contains("test_product1"));
assertTrue(productNames.contains("test_product2"));
assertTrue(productNames.contains("test_product3"));
1
qo'shib qo'ydi
@downvoter, mening javobim bilan nima muammo borligini tushuntirib bering.
qo'shib qo'ydi muallif Abubakkar, manba

Hamcrestni bilmasam, mening halim har bir ro'yxatni (yoki ularning nusxalarini ularni o'zgartirishga rozi bo'lmasa) tartiblash va keyin ularni teng deb tasdiqlaydi.

Kuchaylik: Shuningdek, ro'yxatda ikki nusxadagi mahsulot bo'lsa, ishlaydi (boshqa ro'yxatda xuddi shu nusxani talab qiladi).

Mahsulotlar ro'yxatidan ismlarni olish uchun oqimdan foydalanishingiz mumkin; boshqa javoblarning ba'zilari allaqachon qanday ekanligini ko'rsatadi.

1
qo'shib qo'ydi

Bunday hollarda assertJ dan foydalanishni afzal ko'raman. Ehtimol, bu qoniqarli bo'ladi. Misol:

    final List actual = Arrays.asList("c", "b", "a");
    final List expected = Arrays.asList("a", "b", "c");
    Assertions.assertThat(actual).containsOnlyElementsOf(expected);
1
qo'shib qo'ydi