最佳答案
给出下面的例子(使用JUnit和Hamcrest匹配器):
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
方法有什么意义吗?Matcher
类似乎不需要它,因为JUnit调用matches方法,它没有使用任何泛型类型,看起来就像试图强制一个不做任何事情的类型安全,因为Matcher
实际上不会匹配,无论如何测试都会失败。没有不安全的操作(至少看起来是这样)。作为参考,下面是assertThat
的JUnit实现:
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());
}
}