Почему assertEquals fails?

carsInRange.get(0)

Я сравниваю 2 объекта (элементы списка), они одинаковые по своим полям, но тест все равно проваливается. Но если я не буду создавать новый список и не буду создавать в нем этот элемент, а просто буду сравнивать уже с существующим объектом из списка cars, то тогда тест проходит успешно. Почему? Ощущение, что он сравнивает не поля, а ссылки в памяти. Если нужен код, я скину.


Ответы (1 шт):

Автор решения: Alexandr

Указанные Вами объекты не равны, т.к. являются разными экземплярами и по-умолчанию будут сравниваться по ссылке. Вам необходимо в классе Car переопределить метод equals() таким образом, чтобы проверка производилась по необходимым Вам полям. Подробнее почитать про метод equals() можно в документации по классу Object:

package com.somepackage;

import java.util.Objects;

public class Car {

    enum BodyType { CROSSOVER_SUV }

    private String name;
    private Double price;
    private Integer fuelConsumption;
    private Integer maxSpeed;
    private BodyType bodyType;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Car car = (Car) o;

        if (!Objects.equals(name, car.name)) return false;
        if (!Objects.equals(price, car.price)) return false;
        if (!Objects.equals(fuelConsumption, car.fuelConsumption)) return false;
        if (!Objects.equals(maxSpeed, car.maxSpeed)) return false;
        return bodyType == car.bodyType;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + (price != null ? price.hashCode() : 0);
        result = 31 * result + (fuelConsumption != null ? fuelConsumption.hashCode() : 0);
        result = 31 * result + (maxSpeed != null ? maxSpeed.hashCode() : 0);
        result = 31 * result + (bodyType != null ? bodyType.hashCode() : 0);
        return result;
    }
}
→ Ссылка