Использование равенства ссылок на объекты, а не .equals в 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), чтобы увидеть, используют ли тестовый вызов и ожидаемый вызов одни и те же аргументы?
  • Если да, есть ли способ заставить его использовать оператор ==, а не .equals(Object o)?

заранее спасибо.


person FoxNounours    schedule 30.10.2017    source источник
comment
Вы, вероятно, найдете свой ответ здесь: Разница между 'same' и 'eq' в EasyMock   -  person Alexandre Dupriez    schedule 30.10.2017
comment
Привет, спасибо за этот ответ. Я уже читал ту тему. Я знаю разницу между .same(Object o) и .equals(Object o). Но действительно ли .equals(Object o) используется для сравнения аргументов, используемых в ожидаемом состоянии макета, и аргументов, используемых в состоянии воспроизведения макета?   -  person FoxNounours    schedule 30.10.2017
comment
Я не знаю ответа на этот вопрос, но вы можете узнать его, поставив точку останова в методе equals метода A, запустив этот тест в отладчике и проверив стек, когда он достигнет точки останова.   -  person Dawood ibn Kareem    schedule 31.10.2017


Ответы (2)


EasyMock использует сопоставители для сравнения ожидаемых и фактических вызовов. Поэтому, если вы не укажете сопоставитель и укажете eq, equals действительно будет вызываться для каждого параметра.

Затем, для макета, EasyMock предоставляет реализацию по умолчанию для equals, поэтому equals нельзя имитировать. Эта реализация по умолчанию на самом деле делает ==.

В вашем примере, предполагая, что A является subject, который на самом деле является VariableNode, на самом деле equals будет вызываться на нем, опять же предполагая, что subject.accept(termVisitor); вызывает visit.

Кстати, вам не нужно subject быть здесь мокарем. Вы определили его как частичный макет, но без насмешки над каким-либо методом, поэтому он в основном похож на обычный класс.

person Henri    schedule 01.11.2017

Спасибо Анри за ваш ответ. Вы дали мне указатель, чтобы найти то, что мне было нужно.

Я использую IArgumentMatcher, чтобы обеспечить сравнение ссылок между аргументами, которые я даю до EasyMock.replay, и аргументами после, поэтому метод equals не вызывается для моего частичного макета.

Вот документация по этому поводу: 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(")");
    }

}
person FoxNounours    schedule 22.03.2018