在EasyMock中使用对象引用相等而不是.equals

时间:2017-10-30 20:03:17

标签: java unit-testing easymock

我正在玩 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);

}

我不明白为什么。所以这是我的问题:

  • EasyMock是否使用.equals(Object o)来查看测试调用和expect调用是否使用相同的参数?
  • 如果是,是否有一种方法可以使用==运算符而不是.equals(Object o)

先谢谢。

2 个答案:

答案 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(")");
    }

}