다음 예에서 Hamcrest 매처와 함께 JUnit 사용 :
Map<String, Class<? extends Serializable>> expected = null;
Map<String, Class<java.util.Date>> result = null;
assertThat(result, is(expected));
다음과 같은 JUnit assertThat
메소드 서명으로 컴파일되지 않습니다 .
public static <T> void assertThat(T actual, Matcher<T> matcher)
컴파일러 오류 메시지는 다음과 같습니다.
Error:Error:line (102)cannot find symbol method
assertThat(java.util.Map<java.lang.String,java.lang.Class<java.util.Date>>,
org.hamcrest.Matcher<java.util.Map<java.lang.String,java.lang.Class
<? extends java.io.Serializable>>>)
그러나 assertThat
메소드 서명을 다음과 같이 변경하면
public static <T> void assertThat(T result, Matcher<? extends T> matcher)
그런 다음 컴파일이 작동합니다.
따라서 세 가지 질문이 있습니다.
- 현재 버전이 정확히 컴파일되지 않는 이유는 무엇입니까? 여기서 공분산 문제를 모호하게 이해했지만, 필요한 경우 설명 할 수 없었습니다.
assertThat
방법을 변경하면 단점 이Matcher<? extends T>
있습니까? 그렇게하면 깨질 다른 사례가 있습니까?assertThat
JUnit 에서 메소드 의 일반화에 대한 요점이 있습니까?Matcher
JUnit을 아무것도하지 않는 형태의 안전을 강제하기 위해 원하는 일반, 그냥 외모에 입력되지 않은 일치하는 메소드를 호출하기 때문에이 같은 클래스는, 그것을 필요로하지 않는 것Matcher
사실 만하지 않습니다 일치하면 테스트가 실패합니다. 안전하지 않은 작업이 필요하지 않습니다 (또는 그렇게 보입니다).
참고로 다음은 JUnit 구현입니다 assertThat
.
public static <T> void assertThat(T actual, Matcher<T> matcher) {
assertThat("", actual, matcher);
}
public static <T> void assertThat(String reason, T actual, Matcher<T> matcher) {
if (!matcher.matches(actual)) {
Description description = new StringDescription();
description.appendText(reason);
description.appendText("\nExpected: ");
matcher.describeTo(description);
description
.appendText("\n got: ")
.appendValue(actual)
.appendText("\n");
throw new java.lang.AssertionError(description.toString());
}
}