gpt4 book ai didi

java - 使用 AssertJ 3 扁平提取 map

转载 作者:行者123 更新时间:2023-12-02 10:32:08 25 4
gpt4 key购买 nike

我正在使用 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 create for varargsparameter 编译警告。

有更好的方法吗?我愿意实现自己的自定义断言,如果需要更简洁的代码,也许可以使用 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")));

希望有帮助...

关于java - 使用 AssertJ 3 扁平提取 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53557039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com