2014-06-17 7 views
9

मेरे पास कहने के इस तरह एक वर्ग:कैसे assertj साथ कुंजी और मूल्यों की गहरी मिलान प्रदर्शन करने के लिए

public class Character { 
    public Character(String name){ 
     this.name = name; 
    } 
    private String name; 
    public String getName() { return name; } 
} 

और बाद में, एक मानचित्र

Map<Character, Integer> characterAges = new HashMap<Character, Integer>(); 
characterAges.put(new Character("Frodo"), 34); 

assertj का उपयोग करना, क्या सबसे अच्छा तरीका है परीक्षण करें कि चरित्र में "फ्रोडो" चरित्र शामिल है? उम्र के लिए, मैं कर सकते हैं:

assertThat(characterAges).hasValue(34); 

और मुझे पता है मैं कर सकता:

assertThat(characterAges.keySet()) 
       .extracting("name") 
       .contains("Frodo"); 

लेकिन तब मैं अपने प्रवाह खो देते हैं। क्या मैं सच में यह कुछ इस तरह हैं:

assertThat(characterAges) 
       .hasKey(key.extracting("name").contains("Frodo") 
       .hasValue(34); 

या और भी बेहतर है, ताकि मुझे यकीन है कि कर सकते हैं मेरी कुंजी और मान मैच:

assertThat(characterAges) 
       .hasEntry(key.extracting("name").contains("Frodo"), 34); 

यह संभव तरह कुछ है?

उत्तर

5

इसके लिए कोई आसान समाधान नहीं है। एक तरीका है नक्शा मानचित्र के लिए custom Assertion लागू करना।

public class CharacterMapAssert extends AbstractMapAssert<MapAssert<Character, Integer>, Map<Character, Integer>, Character, Integer> { 

    public CharacterMapAssert(Map<Character, Integer> actual) { 
     super(actual, CharacterMapAssert.class); 
    } 

    public static CharacterMapAssert assertThat(Map<Character, Integer> actual) { 
     return new CharacterMapAssert(actual); 
    } 

    public CharacterMapAssert hasNameWithAge(String name, int age) { 
     isNotNull(); 

     for (Map.Entry<Character, Integer> entrySet : actual.entrySet()) { 
      if (entrySet.getKey().getName().contains(name) && (int) entrySet.getValue() == age) { 
       return this; 
      } 
     } 

     String msg = String.format("entry with name %s and age %s does not exist", name, age); 
     throw new AssertionError(msg); 
    } 

} 

परीक्षण मामले में:

assertThat(characterAges).hasNameWithAge("Frodo", 34); 

बारे में पता है कि आप हर कस्टम डेटा संरचना अपने स्वयं के दावे लिखने के लिए कर रखी है यहाँ इस समस्या के लिए एक सरल कस्टम अभिकथन उदाहरण है। आपके लिए Character कक्षा आप AssertJ assertions generator के साथ एक दावा उत्पन्न कर सकते हैं।


अद्यतन जावा 8

जावा के साथ 8 भी लैम्ब्डा अभिव्यक्ति के लिए इस्तेमाल किया जा सकता है

assertThat(characterAges).matches(
      (Map<Character, Integer> t) 
      -> t.entrySet().stream().anyMatch((Map.Entry<Character, Integer> t1) 
        -> "Frodo".equals(t1.getKey().getName()) && 34 == t1.getValue()), 
      "is Frodo and 34 years old" 
    ); 
+0

कोई बुरा समाधान नहीं, जॉन - धन्यवाद। – pduncan

2

तुम भी कुछ इस तरह कर सकते हैं:

assertThat(characterAges).contains(entry("Frodo", 34), ...); 

https://github.com/joel-costigliola/assertj-core/wiki/New-and-noteworthy#new-map-assertions

देखें
+3

यह करीब लगता है, लेकिन मेरे प्रश्न में कुंजी एक चरित्र है, स्ट्रिंग नहीं। मैं कैसे कहूं कि यह "फ्रोडो" के नाम से एक चरित्र है? – pduncan

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