यह जाँचना कि हैमरेस्ट में कोई सूची खाली नहीं है


147

मैं सोच रहा था कि क्या किसी को यह जांचने का तरीका पता है कि क्या सूची का उपयोग करके खाली है assertThat()और Matchers?

सबसे अच्छा तरीका मैं सिर्फ JUnit का उपयोग कर सकता है:

assertFalse(list.isEmpty());

लेकिन मुझे उम्मीद थी कि हैमरेस्ट में ऐसा करने का कोई तरीका था।


2
बेहतर समाधान के लिए, इस पर वोट करें: code.google.com/p/hamcrest/issues/detail?id=97
फैब्रिकियो लेमोस

2
@FabricioLemos समस्या # 97 को हल करने और मास्टर गिट शाखा में विलय होने लगता है। उम्मीद है कि यह जल्द ही अगले हैमरेस्ट रिलीज़ में होगा।
रफालमग

@ अराफालमग गुड स्पॉट।
V1.3

जवाबों:


165

वैसे हमेशा है

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

... लेकिन मैं अनुमान लगा रहा हूँ कि आप जो चाहते थे वह काफी नहीं है :)

वैकल्पिक रूप से:

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

empty()Matchersकक्षा में एक स्थिर है । नोट कास्ट करने के लिए की जरूरत listके लिए Collection, Hamcrest 1.2 के wonky जेनरिक के लिए धन्यवाद।

निम्नलिखित आयात का उपयोग हैमरेस्ट 1.3 के साथ किया जा सकता है

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

6
मुझे लगता है कि अगर आप कोष्ठक अदृश्य बनाने के लिए अपने वाक्यविन्यास को बदलने के लिए हैमरेस्ट कोड बहुत अच्छे लगते हैं ...
स्केफमैन 20

2
@ tkeE2036: यह काम में हैमरेस्ट की टूटी हुई जेनरिक है। कभी-कभी आपको इसे संकलित करने के लिए कास्ट करने की आवश्यकता होती है, उदाहरण के लिएassertThat((Collection)list, is(not(empty())));
skaffman


14
@dzieciou परीक्षण के विफल होने पर यह आपको एक बेहतर त्रुटि संदेश देता है। तो इसके बजाय expected true but got falseआपको कुछ मिलता हैexpected empty but got [1, 2, 3]
ब्रैड कपिट

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))) होगा , तो इसके विपरीतlistnullassertThat(list, hasSize(greaterThan(0)))
जोस एंडियास

5

यदि आप पढ़ने योग्य विफल संदेशों के बाद हैं, तो आप खाली सूची के साथ सामान्य दावे का उपयोग करके हैमरेस्ट के बिना कर सकते हैं:

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

जैसे अगर तुम दौड़ो

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

आपको मिला

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

2
यह देखना वास्तव में अच्छा है कि कथित खाली सूची में क्या छोड़ा गया था!
एचडीवी

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"); }
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.