java - hamcrest TypeSafeMatcher 无法匹配双数组

标签 java unit-testing hamcrest

<分区>

我写了这个匹配器来检查 double[] 的内容:

@SuppressWarnings({ "rawtypes", "unchecked" })
public static Matcher<double[]> isArrayCloseTo(double[] expected) {
    final double DELTA = 1e-10;
    List<Matcher<Double>> matchers = new ArrayList<>();
    for (double d : expected)
        matchers.add(new IsCloseTo(d, DELTA));
    return new IsArray(matchers.toArray(new Matcher[matchers.size()]));
}

我禁止显示这些警告,因为对于没有通用类型的数组我无能为力。该方法看起来不错,但总是失败:

assertThat(new double[] { .1 }, isArrayCloseTo(new double[] { .1 })); //fails

问题出在TypesafeMatcher, line 65 : expectedType.isInstance(item),其中 expectedTypeObject.classitem[0.1 ]

我怀疑这个问题与我无法泛化传递给 IsArrayMatcher 数组有关,但我不知道如何解决这个问题。谁能告诉我应该如何匹配 double 数组?

最佳答案

它最终回到了一个事实 double[]无法转换为 Double[] , Matcher<double[]> 也是如此至 Matcher<Double[]> .

如果你能改变你对原语的所有使用 double[]Double[] ,那么您的方法就可以正常工作。否则,您将需要编写自己的自定义匹配器。我在下面包含了一个基于您的代码构建的自定义匹配器。

这基本上是这个的副本: How can I use Hamcrest to check if each element in an array of doubles is "close" to each element in another array?

@SuppressWarnings({"rawtypes", "unchecked"})
public static Matcher<double[]> isArrayCloseTo(double[] expected) {
    final double DELTA = 1e-10;
    List<Matcher<Double>> matchers = new ArrayList<>();
    for (double d : expected)
        matchers.add(new IsCloseTo(d, DELTA));

    return new CustomTypeSafeMatcher<double[]>("array that is close to" + Arrays.toString(expected)) {
        @Override
        protected boolean matchesSafely(double[] actual) {
            return new IsArray<Double>(matchers.toArray(new Matcher[matchers.size()]))
                    .matchesSafely(Arrays.stream(actual).boxed().toArray(Double[]::new));
        }
    };
}

关于java - hamcrest TypeSafeMatcher 无法匹配双数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28190945/

相关文章:

unit-testing - Grails 2.4.4中带有@TestFor的ClassCastException

java - Robolectric Resources$NotFoundException 找不到库 (aar) 资源

java - JavaFX tableview 中消失的水平网格线

swift - 核心数据查询的单元测试用例

java - 如何模拟 java.net.NetworkInterface?

java - 如何编写复合 Hamcrest 语句(具有逻辑 "or"操作)

java - Hamcrest 或assertj : test element in list with requirements

Java 类将大于视为大于或等于

java - 如何正确设计类

java - hamcrest 中的递归 SamePropertyValuesAs 匹配器