2014-09-03 6 views
10

hasProperty, किसी दिए गए संपत्ति के मूल्य के लिए जाँच करने hasItem साथ इस्तेमाल किया जा सकता जैसे:Hamcrest मिलान

Matcher hasName = Matchers<Person>hasProperty("name", is("Winkleburger")); 
assertThat(names, hasItem(hasName)); 

यह जब नाम, यानी एक संपत्ति है ठीक है: वहाँ getName() नामक एक विधि है।

क्या कोई ऐसा मैचर है जो ऐसी विधि की जांच करेगा जो संपत्ति नहीं है? यानी: इस मामले में, यह संग्रह में आइटमों के लिए getName() की बजाय name() विधि के वापसी मूल्य की जांच करेगा।

+0

तो, आप संग्रह के सभी आइटमों पर नाम() विधि को कॉल करना चाहते हैं? –

उत्तर

12

आप इसके लिए एक और हैमक्रिस्ट अंतर्निहित, FeatureMatcher का उपयोग कर सकते हैं। इन्हें अन्य इनपुट में बदलने के बाद इन्हें अन्य मैचर्स के साथ जोड़ा जाने के लिए डिज़ाइन किया गया है। तो आपके मामले में आप कुछ इस तरह करना होगा:

@Test 
public void test1() { 
    List<Person> names = new ArrayList<>(); 
    names.add(new Person("Bob")); 
    names.add(new Person("i")); 

    assertThat(names, hasItem(name(equalTo("Winkleburger")))); 
} 

private FeatureMatcher<Person, String> name(Matcher<String> matcher) { 
    return new FeatureMatcher<Person, String>(matcher, "name", "name") { 
     @Override 
     protected String featureValueOf(Person actual) { 
      return actual.name(); 
     } 
    }; 
} 

लाभ आप एक कस्टम मिलान पर इस के साथ मिल जाएगा कि यह पूरी तरह से पुन: प्रयोज्य और सभी यह करता है के रूप में अन्य matchers साथ composable है डेटा-निष्कर्षण तो है आप जो भी अन्य matcher चाहते हैं उसे रोकता है। आपको उचित डायग्नोस्टिक्स भी मिलेंगे, उदा। उपर्युक्त उदाहरण में यदि आप उस मूल्य पर जोर डालते हैं जो मौजूद नहीं है तो आपको प्राप्त होगा:

java.lang.AssertionError: 
    Expected: a collection containing name "Batman" 
    but: name was "Bob", name was "Winkleburger" 
2

आप एक अपने आप को लिख सकते हैं:

public class HasName extends TypeSafeMatcher<MyClass> { 
    private String expectedName; 

    private HasName(String expectedName) { 
     this.expectedName = expectedName; 
    } 

    @Override 
    public boolean matchesSafely(MyClass obj) { 
     return expectedName.equals(obj.name()); 
    } 

    @Factory 
    public static Matcher<MyClass> hasName(String expectedName) { 
     return new HasName(expectedName); 
    } 
} 

कहाँ MyClass कक्षा या इंटरफ़ेस जो name() विधि को परिभाषित करता है।

संबंधित मुद्दे