簡體   English   中英

使用AssertJ 3進行FlatExtracting地圖

[英]FlatExtracting Map with AssertJ 3

我正在使用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編譯警告的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")));

還有其他想法嗎?

您可以嘗試使用hasKeySatisfying並使用lambda構建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"))); 

希望能幫助到你 ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM