java - 用于比较父类(super class)和子类的 Hamcrest 匹配器

标签 java junit matcher hamcrest

我有以下类(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/

相关文章:

Java:JUnit 测试在 IntelliJ 中运行,但不在 Maven 中运行

java - Hamcrest isEqualIgnoringWhitespace 不忽略空格

java - 需要更换<p>你是吗? [xxxrecipientFirstNamexxx] </p> 和 <p>你是吗? {recipientFirstName} </p>

java 匹配器不处理 ^ 和 $ 符号

java - Eclipse:为项目导出用户库/库的 Ant 脚本

java - 如何删除静态变量但仍允许全局调用变量?

java - 在 NetBeans Visual Library 教程上添加背景图像

java - 如何测试 InputMethodService

java - JUnit 测试 SpringJUnit4ClassRunner

java - 自己创建一个ResultSet对象