我有以下类(class):
abstract class Answer<T> {}
class AnswerInt extends Answer<Integer> {}
class AnswerText extends Answer<String> {}
现在我想在下面的测试中使用 Hamcrest Matcher(这只是简化的示例):
@Test
public void test() {
Answer a = new AnswerInt(5);
assertThat(a, is(new AnswerInt(5))); // Compile error
}
但是我得到了编译错误:
The method assertThat(T, Matcher<? super T>) in the type MatcherAssert is not applicable for the arguments (Answer, Matcher<AnswerInt>)
.
我理解错误信息,但不明白为什么 assertThat
定义为 .. Matcher<? super T>
.
是否可以编写混合父类(super class)和子类的断言?
接下来,我想写这样的断言:
Map<String,Answer> answerMap = questionary.getAnswerMap();
assertThat(answerMap, allOf(
hasEntry("var1", new AnswerInt(5)),
hasEntry("var2", new AnswerText("foo"))
));
但我遇到了同样的错误。
我使用的是 Hamcrest 1.3 版
最佳答案
如果您使用 Java 8 运行测试,它会编译。对于以前的版本,您必须给编译器一个提示:
@Test
public void test() {
Answer a = new AnswerInt(5);
assertThat(a, Matchers.<Answer>is(new AnswerInt(5)));
}
关于java - 用于比较父类(super class)和子类的 Hamcrest 匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20845570/