Я использую 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")));
Есть еще идеи?