Java Mocking - Внедрить `equals` и` toString` во внешний класс - PullRequest
0 голосов
/ 01 мая 2018

Я столкнулся с небольшим количеством проблем при попытке проверить взаимодействие с внешним API. В частности, значительное количество классов, которые API использует для хранения данных, не имеют методов equals и toString, что затрудняет сравнение того, создали ли API ожидаемые объекты, довольно сложно, так как они возвращаются во множестве сложных списки-комбинации карт. Который, если бы я хотел вручную проверить на равенство, мне пришлось бы каждый раз писать собственную проверку глубокого равенства.

Поэтому мне было интересно, можно ли внедрить пользовательскую реализацию eqauls (и, может быть, даже toString) в этот класс с PowerMock, Mockito и JUnit 4 (это моя тестовая среда). Или, если есть способ указать JUnit использовать пользовательский метод для сравнения объектов этих классов данных.
Библиотеки, которые хорошо интегрируются с этой настройкой, приветствуются.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Методы такого типа такие же, как если бы вы просто написали прокси-объект, например:

public class A {
    int c;
    int d;
}

public class B extends A {
    @Override
    public boolean equals(Object o) {
        if (o instanceof A) {
            A a = (A) o;
            return this.c == a.c && this.d == a.d;
        } else {
            return false;
        }
    }

    @Override
    public String toString() {
        return "B [c=" + c + ", d=" + d + "]";
    }
}

Вы не можете надежно изменить реализацию базового класса (A), не рискуя распространять исключения в другом месте кода, которые, возможно, полагались на поведение от toString до equals, маловероятно, но это все еще будет беспокойство в следующий раз что-то перестает работать. Если вы просто собираетесь делать это в ходе тестирования, а не в производстве, однако, это может быть приемлемым, и вы можете обратиться к существующим вопросам в этой области, таким как Можно ли переопределить метод во время выполнения?

0 голосов
/ 01 мая 2018

Возможно, вам нужна комбинация совпадений Hamcrest и assertThat , например. assertThat(obj, matcher).

Например, если у вас есть экземпляр, созданный вручную, вы можете использовать сопоставитель SamePropertyValuesAs для проверки соответствия экземпляров.

...