我正在玩 EasyMock ,我找到了一些我不理解的东西。
我获得了主题课A
(正在测试的课程)其中A.equals(Object o)
是@Override
。
当我在下面进行测试时,我在A.equals
方法中得到了覆盖:
@Test
public void acceptVisitor() {
subject = EasyMock.createMockBuilder(VariableNode.class).createMock();
ITermVisitor termVisitor = EasyMock.createMock(ITermVisitor.class);
termVisitor.visit(subject);
EasyMock.replay(subject, termVisitor);
subject.accept(termVisitor);
EasyMock.verify(subject, termVisitor);
}
我不明白为什么。所以这是我的问题:
.equals(Object o)
来查看测试调用和expect调用是否使用相同的参数?==
运算符而不是.equals(Object o)
?先谢谢。
答案 0 :(得分:0)
EasyMock使用匹配器来比较期望和实际调用。因此,如果您未指定匹配器并指定eq
,则会在每个参数上调用equals
。
然后,对于模拟,EasyMock为equals
提供默认实现,这就是equals
无法模拟的原因。这个默认实现实际上正在执行==
。
在您的示例中,假设A
subject
实际上是VariableNode
,实际上equals
会被调用,同样假设subject.accept(termVisitor);
是visit
致电subject
。
as_json
来模仿这里。你将它定义为部分模拟,但没有嘲笑任何方法,因此它基本上像普通类。
答案 1 :(得分:0)
感谢Henri的回答。你给了我指针,找到我需要的东西。
我使用IArgumentMatcher来确保比较我在EasyMock.replay之前提供的参数与之后的参数之间的参考,因此不会在我的部分模拟上调用等于的方法。
以下是有关此内容的文档:http://easymock.org/user-guide.html#verification-matchers
这是我的SameArgumentMatcher的代码:
import org.easymock.IArgumentMatcher;
public class SameArgumentMatcher implements IArgumentMatcher {
private Object expected;
public SameArgumentMatcher(Object expected) {
this.expected = expected;
}
@Override
public boolean matches(Object argument) {
return expected == argument;
}
@Override
public void appendTo(StringBuffer buffer) {
buffer.append("SameArgumentMatcher(")
.append(expected.getClass().getName())
.append("@").append(expected.toString())
.append(")");
}
}