Почему тест завершается неудачей при сравнении двух одинаковых объектов в Java?

#java #unit-testing

#java #модульное тестирование

Вопрос:

Я пытаюсь создать полиномиальный калькулятор, чтобы научиться программировать, и когда я его тестирую, есть часть, которая терпит неудачу при сравнении двух одинаковых объектов, что для меня не имеет никакого смысла. Смотрите Следующий тестовый модуль, который терпит неудачу.

 @Test
public void testAddition() {
        P1 = new PolynomialImp("12x^2 5");
        P2 = new PolynomialImp("16x^2 6");
        Polynomial P3 = P1.add(P2);
        Polynomial P4 = new PolynomialImp("28x^3 11");
        assertTrue(P3.equals(P4));
        
    }
  

Дело в том, что он завершается неудачей, даже когда я меняю тестер на следующий.

 @Test
public void testAddition() {
        P1 = new PolynomialImp("12x^3 5");
        P2 = new PolynomialImp("16x^3 6");
        Polynomial P3 = new PolynomialImp("28x^3 11");
        Polynomial P4 = new PolynomialImp("28x^3 11");
        assertTrue(P3.equals(P4));
    }
  

Разве это не должно проходить, учитывая, что они оба созданы с одними и теми же переменными?

Комментарии:

1. Вы должны показать свой PolynomialImp класс.

2. Первый тест завершается неудачей, потому 12x^2 16x^2 что make 28x^2 — not 28x^3 . Что касается второго тестового образца, невозможно определить, что не так, без какой-либо информации о реализации PolynomialImp класса и особенно его equals() метода.

Ответ №1:

Реализация по умолчанию выполняется equals() только тогда, когда оба объекта являются одним и тем же объектом, поэтому только для P3.equals(P3) или если вы делаете

 P3 = new ...
P4 = P3;
P3.equals(P4); // true
  

Если вам нужна эквивалентность, основанная на логике вашей программы (т.Е. 2 многочлена равны, если они инициализированы одной и той же строкой), вам нужно переопределить метод equals() вашего класса и реализовать эту логику самостоятельно.

Ответ №2:

P3.equals(P4) проверяет, являются ли P3 и P4 одним и тем же экземпляром объекта. Вы должны переопределить equals метод, чтобы вернуть true или false соответственно.

Комментарии:

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