java – 用于比较超类和子类的Hamcrest匹配器

我有以下课程:

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
}    

但我得到编译错误:
方法断言MatcherAssert类型中的(T,Matcher<?super T>)不适用于参数(Answer,Matcher< AnswerInt>).

我确实理解错误消息,但我不明白为什么断言定义为…匹配<?超级T>.

是否有可能编写混合超类和子类的断言?

接下来,我想写一些断言,如:

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 – 递归SamePropertyValues作为hamcrest中的匹配器


下一篇:php – Mockery:测试参数是否是包含键/值对的数组