Плоская извлекающая карта с AssertJ 3 - PullRequest
0 голосов
/ 30 ноября 2018

Я использую AssertJ 3.11.1 и пытаюсь полностью избавиться от Hamcrest.До сих пор мне удавалось, но у меня были проблемы со следующим кодом:

class Foo {
  private final Map<String, String> innerMap;

  Foo(Map<String, String> innerMap) {
    this.innerMap = innerMap;
  }

  public Map<String, String> getInnerMap() {
    return this.innerMap;
  }

}

Map<String, String> innerMap = new HashMap<>();
innerMap.put("key1", "value1");
innerMap.put("key2", "value2");

Foo foo = new Foo(innerMap);

Map<Foo, String> map = new HashMap<>();
map.put(foo, "notUsed");

С Hamcrest я могу легко сделать:

assertThat(metrics,
  hasKey(
    hasProperty("innerMap",
        allOf(hasEntry("key1", "value1"), hasEntry("key2", "value2")))));

Однако, нет простого перевода в AssertJ.Мой лучший подход до сих пор был примерно таким (Java 8):

assertThat(metrics.keySet().stream().map(Foo::getInnerMap))
    .flatExtracting(Map::entrySet)
    .contains(entry("key1", "value1"), entry("key2", "value2"));

Но этот код не настолько описательный, как в Hamcrest, не говоря уже о том, что я получил предупреждение Unchecked generic array creation for varargs parameter о компиляции.

Есть ли лучший способ сделать это?Я готов реализовать собственное утверждение и, возможно, использовать hasKeySatisfying() из AbstractMapAssert, если это необходимо для более чистого кода.

Я знаю, что могу использовать HamcrestCondition, но я бы предпочел не использовать Hamcrest вообще.

Заранее спасибо!

РЕДАКТИРОВАТЬ:

На данный момент я придумал это:

public class ExtendedMapAssert<K, V> extends MapAssert<K, V> {

  ExtendedMapAssert(final Map<K, V> actual) {
    super(actual);
  }

  public ExtendedMapAssert<K, V> hasAnyKeySatisfying(final Consumer<K> consumer) {
    isNotNull();

    assertThat(actual.keySet()).isNotEmpty().anySatisfy(consumer);

    return this;
  }
}

public static <K, V> ExtendedMapAssert<K, V> assertThatMap(final Map<K, V> map) {
  return new ExtendedMapAssert<>(map);
}

А потом используйте это как:

assertThatMap(metrics)
  .hasAnyKeySatisfying(
    metricId ->
      assertThat(metricId.getTags())
        .contains(entry("key1", "value1"), entry("key2", "value2")));

Есть еще идеи?

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете попробовать hasKeySatisfying и построить Condition с лямбда-выражением (пока нет аналогичного утверждения, которое бы заняло бы Consumer, но вклады приветствуются!) Или использовать предложенный вами подходно проще:

// assertion fails for empty collections no need to use isNotEmpty
assertThat(metrics.keySet()).anySatisfy(metricId ->
  assertThat(metricId.getTags()).contains(entry("key1", "value1"), entry("key2", "value2"))); 

Надеюсь, это поможет ...

...