使用AssertJ 3

时间:2018-11-30 11:53:15

标签: java unit-testing java-8 hamcrest assertj

我正在使用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 :(得分:1)

您可以尝试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"))); 

希望这对您有帮助...