2014-06-17 6 views
9

że mam klasa tak:Jak wykonać głębsze dopasowanie kluczy i wartości z assertj

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

A później Mapa

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

Korzystanie assertj, co jest najlepszym sposobem przetestować, że charakter znaków zawiera znak "Frodo"? Dla wieku, mogę zrobić:

assertThat(characterAges).hasValue(34); 

I wiem, że mogę to zrobić:

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

Ale wtedy tracę płynność. Co naprawdę chcę to coś takiego:

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

lub nawet lepiej, tak że mogę sprawić, że mój klucz i wartość mecz:

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

Czy coś takiego jest możliwe?

Odpowiedz

5

Nie ma na to łatwego rozwiązania. Jednym ze sposobów jest implementacja mapy znaków dla postaci custom Assertion. Oto prosty przykład zwyczaj Twierdzenie tego problemu:

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

} 

W przypadku testu:

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

Należy pamiętać, że trzeba dla każdej niestandardowej strukturze danych pisać własne twierdzenia. Dla Ciebie klasa Character możesz wygenerować asercję z AssertJ assertions generator.


Aktualizacja Java 8

Z Java 8 może także Expression Lambda wykorzystywane

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

Niezłe rozwiązanie, John - dzięki. – pduncan

Powiązane problemy