การตรวจสอบว่ารายการไม่ว่างใน Hamcrest


147

ฉันสงสัยว่าใครรู้วิธีการตรวจสอบว่ารายการว่างเปล่าใช้assertThat()และMatchers?

วิธีที่ดีที่สุดที่ฉันเห็นเพียงใช้ JUnit:

assertFalse(list.isEmpty());

แต่ฉันหวังว่าจะมีวิธีการทำเช่นนี้ใน Hamcrest


2
เพื่อการแก้ปัญหาที่ดีกว่าให้ลงคะแนนสำหรับ: code.google.com/p/hamcrest/issues/detail?id=97
Fabricio Lemos

2
@FabricioLemos ปัญหา # 97 ดูเหมือนว่าจะได้รับการแก้ไขและผสานกับหลัก git branch ให้หวังว่ามันจะเร็ว ๆ นี้ในการปล่อยแฮมสเครสต่อไป
rafalmag

@rafalmag จุดที่ดี จะดีในการแก้ไขปัญหายืนยันไม่ให้สามารถอ่านได้ทั้งหมดของฉันเมื่อ v1.3 จะถูกปล่อยออก
andyb

คำตอบ:


165

มีอยู่เสมอ

assertThat(list.isEmpty(), is(false));

... แต่ฉันเดาว่านั่นไม่ใช่สิ่งที่คุณหมายถึง :)

อีกวิธีหนึ่งคือ:

assertThat((Collection)list, is(not(empty())));

empty()เป็นแบบคงที่ในMatchersชั้นเรียน สังเกตความจำเป็นที่จะต้องส่งผ่านlistไปCollectionด้วยขอบคุณนายพลผู้กล้าหาญ Hamcrest 1.2

การนำเข้าต่อไปนี้สามารถใช้กับ hamcrest 1.3

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;

6
ผมพบว่ารหัส Hamcrest ดูดีกว่ามากถ้าคุณเปลี่ยนไวยากรณ์ของคุณไฮไลท์ที่จะทำให้วงเล็บที่มองไม่เห็น ...
skaffman

2
@ tkeE2036: นั่นเป็นชื่อสามัญของ Hamcrest ที่ทำงานอยู่ บางครั้งคุณจำเป็นต้องร่ายเพื่อทำให้คอมไพล์เช่นassertThat((Collection)list, is(not(empty())));
skaffman

7
สิ่งนี้ได้รับการแก้ไขใน 1.3
artbristol

14
@dzieciou มันให้ข้อความผิดพลาดที่ดีขึ้นเมื่อการทดสอบล้มเหลว ดังนั้นแทนที่จะให้expected true but got falseคุณได้อะไรเช่นนี้expected empty but got [1, 2, 3]
Brad Cupit

3
หากคุณไม่ต้องการการแปลงที่ไม่มีการตรวจสอบและยินดีที่จะยกเลิกการนำเข้าแบบคงที่คุณสามารถเพิ่มข้อมูลทั่วไปในวิธีการเช่น: assertThat(list, Matchers.<String>empty())(สมมติว่ารายการคือชุดของไฟล์String)
earcam

77

สิ่งนี้ได้รับการแก้ไขใน Hamcrest 1.3 โค้ดด้านล่างรวบรวมและไม่สร้างคำเตือนใด ๆ :

// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, is(not(empty())));

แต่ถ้าคุณต้องใช้รุ่นที่เก่ากว่า - แทนที่จะเป็นบั๊กempty()คุณสามารถใช้:

hasSize(greaterThan(0))
( import static org.hamcrest.number.OrderingComparison.greaterThan;หรือ
import static org.hamcrest.Matchers.greaterThan; )

ตัวอย่าง:

// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, hasSize(greaterThan(0)));

สิ่งที่สำคัญที่สุดเกี่ยวกับการแก้ปัญหาข้างต้นคือมันไม่ได้สร้างคำเตือนใด ๆ วิธีที่สองมีประโยชน์มากกว่าถ้าคุณต้องการประมาณขนาดผลลัพธ์ขั้นต่ำ


1
@rogerdpack ไปเลย ฉันเพิ่มตัวอย่างสไตล์ 1.3 :)
rafalmag

1
ระวังว่าassertThat(list, not(hasSize(0)))จะประสบความสำเร็จถ้าlistเป็นnullเมื่อเทียบกับassertThat(list, hasSize(greaterThan(0)))
José Andias

5

หากคุณหลังจากข้อความล้มเหลวที่สามารถอ่านได้คุณสามารถทำได้โดยไม่ต้อง hamcrest โดยใช้ assertEquals ปกติกับรายการว่าง:

assertEquals(new ArrayList<>(0), yourList);

เช่นถ้าคุณวิ่ง

assertEquals(new ArrayList<>(0), Arrays.asList("foo", "bar");

คุณได้รับ

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]

2
เป็นเรื่องที่ดีมากที่ได้เห็นสิ่งที่เหลืออยู่ในรายการว่างเปล่าที่คาดคะเน!
HDave

0

สร้าง IsEmpty TypeSafeMatcher ของคุณเอง:

แม้ว่าปัญหาทั่วไปจะได้รับการแก้ไขใน1.3สิ่งที่ยอดเยี่ยมเกี่ยวกับวิธีการนี้คือมันใช้ได้กับคลาสใดก็ตามที่มีisEmpty()วิธีการ! ไม่ใช่แค่Collections!

ตัวอย่างเช่นมันจะทำงานStringเช่นกัน!

/* Matches any class that has an <code>isEmpty()</code> method
 * that returns a <code>boolean</code> */ 
public class IsEmpty<T> extends TypeSafeMatcher<T>
{
    @Factory
    public static <T> Matcher<T> empty()
    {
        return new IsEmpty<T>();
    }

    @Override
    protected boolean matchesSafely(@Nonnull final T item)
    {
        try { return (boolean) item.getClass().getMethod("isEmpty", (Class<?>[]) null).invoke(item); }
        catch (final NoSuchMethodException e) { return false; }
        catch (final InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); }
    }

    @Override
    public void describeTo(@Nonnull final Description description) { description.appendText("is empty"); }
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.