18

次のようなクラスがあるとします。

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 を使用して、characterAges に "Frodo" キャラクターが含まれていることをテストする最良の方法は何ですか? 年齢については、次のことができます。

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

このようなことは可能ですか?

4

7 に答える 7

5

これには簡単な解決策はありません。1 つの方法は、文字マップのカスタム アサーションを実装することです。この問題に対する簡単なカスタム アサーションの例を次に示します。

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でアサーションを生成できます。


Java 8 を更新する

Java 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"
    );
于 2015-02-01T10:24:40.137 に答える
5

次のようなこともできます。

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

https://github.com/joel-costigliola/assertj-core/wiki/New-and-noteworthy#new-map-assertionsを参照してください

于 2015-10-01T15:06:49.383 に答える