Как выполнить осмысленное сравнение между двумя объектами, которые не реализуют метод equals? - PullRequest
2 голосов
/ 30 августа 2011

Я пишу тестовые случаи, в которых мне нужно осмысленно сравнить два объекта, которые не реализуют equals. Я не хочу писать equals или hashcode методы для этих объектов.

Есть ли API, который может сделать это для меня?

Ответы [ 4 ]

6 голосов
/ 30 августа 2011

Apache commons-lang имеет автоматический конструктор равных - например, «Отражение-равно». Документация по API для EqualsBilder. Также обратите внимание, что в той же библиотеке есть HashCodeBuilder.


Пример использования этой библиотеки:

static class A {
    private int a;
    private String b;
    A(int a, String b) {
        this.a = a;
        this.b = b;
    }
}

public static void main(String[] args) {
    A a1 = new A(123, "Hello World!");
    A a2 = new A(321, "Hello!");
    A a3 = new A(123, "Hello World!");

    System.out.println(EqualsBuilder.reflectionEquals(a1, a2, true));
    System.out.println(EqualsBuilder.reflectionEquals(a1, a3, true));
}

Выход:

false
true
2 голосов
/ 30 августа 2011

Если это просто для тестового кода, вы можете просто создать вспомогательный метод для инкапсуляции ваших утверждений:

public static void assertMyClassEquals(MyClass expected, MyClass actual) {
    assertEquals(expected.foo, actual.foo);
    //...
}

Но я не уверен, что понимаю ваше отвращение к созданию equals() метода, который, очевидно, может быть полезен.

1 голос
/ 30 августа 2011

Иногда сравнение результата toString является значимым сравнением.

1 голос
/ 30 августа 2011

Да, есть пример использования компаратора, который должен идеально соответствовать вашим потребностям.

Ссылка на API JAVA Компаратор интерфейса

И ссылка на пост в блоге, объясняющий, как его использовать. Интерфейсы Comparable и Comparator - часть 2

...