使用 AssertJ 3 平面提取地图
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
编译警告。
有更好的方法吗?我愿意实现我自己的自定义断言,如果需要更清晰的代码,我可能会使用 AbstractMapAssert
中的 hasKeySatisfying()
。
我知道我可以使用 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")));
希望对您有所帮助...
我正在使用 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
编译警告。
有更好的方法吗?我愿意实现我自己的自定义断言,如果需要更清晰的代码,我可能会使用 AbstractMapAssert
中的 hasKeySatisfying()
。
我知道我可以使用 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")));
希望对您有所帮助...