gpt4 book ai didi

java - Hamcrest 匹配器使用项目的自定义匹配器按项目比较两个不同类型的集合

转载 作者:太空宇宙 更新时间:2023-11-04 14:20:06 26 4
gpt4 key购买 nike

我有两个对象集合。这两个集合中的对象属于不同类型,并且有一个自定义匹配器来检查它们是否引用相同的事物。此外,集合的顺序相同。比如说,我们可以按名称比较这些集合中的实体,它们按该名称排序,并且我们有一个自定义匹配器,如果名称相同则返回 true。

我需要的是一个匹配器,它可以逐项迭代这两个集合,并使用现有的自定义匹配器比较这些对(我也可以修改它)。

有人知道怎么做吗?

这就是我的意思:

List lA =....;
List lB =....;<p></p>

<p>// what i have: </p>

<p>for (int i = 0; i < lA.size(); i++) {
assertThat(lA.get(i), matchesUsingMyCustomMatcher(lB.get(i));
}</p>

<p>// what i would like to have
assertThat(lA, someMagicMatcher(myModifiedCustomMatcher(lB)));</p>

<p></p>

最佳答案

让我们考虑一下这个测试:

@Test
public void test() throws Exception {
List<MyType1> expected = ...;
List<MyType2> actual = ...;

assertThat(actual, containsUsingCustomMatcher(expected));
}

您可以使用以下辅助函数(matchesUsingMyCustomMatcher 与您的示例中的函数相同)。

private Matcher<Iterable<? extends MyType2>> containsUsingCustomMatcher(List<MyType1> items) {
List<Matcher<? super MyType2>> matchers = new ArrayList<Matcher<? super MyType2>>();
for (MyType1 item : items) {
matchers.add(matchesUsingMyCustomMatcher(item));
}
return Matchers.contains(matchers);
}
<小时/>

通用方法

对于更具可重用性的方法,也许以下内容可以帮助您。首先我们需要一个通用的辅助函数。

public static <T, R> Matcher<Iterable<? extends R>> containsUsingCustomMatcher(List<T> items, MatcherFunction<T, R> matcherFunction) {
return Matchers.contains(createMatchers(items, matcherFunction));
}

private static <R, T> List<Matcher<? super R>> createMatchers(List<T> items, MatcherFunction<T, R> matcherFunction) {
List<Matcher<? super R>> matchers = new ArrayList<Matcher<? super R>>();
for (T item : items) {
matchers.add(matcherFunction.apply(item));
}
return matchers;
}

和一个接口(interface)MatcherFunction。该接口(interface)的实现必须创建适当的匹配器

public interface MatcherFunction<T, R> {
Matcher<R> apply(T t);
}

实现与本答案第一部分相同的示例用法:

assertThat(actual, containsUsingCustomMatcher(expected, myCustomMatcherFunction()));

private MatcherFunction<MyType1, MyType2> myCustomMatcherFunction() {
return new MatcherFunction<MyType1, MyType2>() {

@Override
public Matcher<MyType2> apply(MyType1 t) {
return matchesUsingMyCustomMatcher(t);
}
};
}

Java 8 注意:

这些匿名类看起来有点难看。使用 Java 8,您可以简单地编写

assertThat(actual, containsUsingCustomMatcher(expected, this::matchesUsingMyCustomMatcher));

关于java - Hamcrest 匹配器使用项目的自定义匹配器按项目比较两个不同类型的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27292452/

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