2015-01-28 7 views
1

의 일치가 나는 double[]의 내용을 확인하기 위해이 정규 표현을 쓴 실패합니다. 이 방법은 잘 보이지만, 항상 실패hamcrest의 TypeSafeMatcher 이중 배열

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

문제는 TypesafeMatcher, line 65에 있습니다 expectedType.isInstance(item), expectedTypeObject.classitem[0.1]입니다입니다.

이 문제는 내가 배열을 일반화 할 수 없다는 의심의 여지가 있습니다. IsArray에 전달하지만이 문제를 해결하는 방법을 모르겠습니다. 아무도 내가 두배의 배열과 일치해야하는 방법을 말해 줄 수 있습니까?

+0

당신이 주장 실패 스택 트레이스를 게시 할 수 :

이것은 본질적으로이의 중복? 문제는'expect'와'Matcher'에 원시 double을 사용하는 것 같습니다. – mystarrocks

답변

3

궁극적으로 double[]Double[]으로 변환 할 수없고, Matcher<double[]>-Matcher<Double[]>도 마찬가지입니다.

double[]에 대한 모든 사용을 Double[]으로 변경할 수 있으면 접근 방식이 정상적으로 작동합니다. 그렇지 않으면 사용자 지정 matcher를 직접 작성해야합니다. 코드에 빌드 된 사용자 지정 Matcher를 아래에 포함했습니다. 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)); 
     } 
    }; 
}