Основываясь на вашем equals
методе, создается впечатление, что вы сравниваете Объекты (примитивы в штучной упаковке) на основе ссылочного равенства . Это ошибка независимо от того, используете ли вы Mockito и как.
Хотя примитивы типа int
можно безопасно сравнивать с помощью ==
, коробочные примитивы типа Integer не следует сравнивать с ==
: у вас может быть два отдельных экземпляра Integer, каждый из которых представляет целое число 3
, например firstInt != secondInt
но firstInt.equals(secondInt)
верно. Это может привести к противоречивому поведению: Java оппортунистически пытается использовать один и тот же экземпляр для строковых литералов и небольших целых чисел, но вы не можете полагаться на это поведение. Это также приведет к тому, что ваш вывод toString
будет идентичным, как вы видите.
Лучший ответ здесь - использовать примитивы, такие как int
, а не коробочные примитивы, такие как Integer: Пока результаты всегда ненулевые, вы ничего не получите, сохраняя коробочные версии. Если вы сделаете это, то ваш текущий метод equals
(впервые опубликованный с помощью gtching в удаленном ответе) будет работать нормально.
Если по какой-либо причине вам необходимо остаться с коробочными примитивами, вам действительно следует сравнивать их с методами equals
.
Так что вместо чеков вроде:
if (nAccountId != that.nAccountId) return false;
if (nAccountCPCMappingid != that.nAccountCPCMappingid) return false;
Выполните проверки следующим образом:
if (!nAccountId.equals(that.nAccountId)) return false;
if (!nAccountCPCMappingid.equals(that.nAccountCPCMappingid)) return false;
Обратите внимание, что целочисленные поля, такие как строковые поля, могут быть null
. Чтобы избежать этого, вы должны явно проверить null
, как вы это делали со строками, или использовать новый метод Objects.equals в Java 8:
if (!Objects.equals(this.nAccountId, that.nAccountId)) return false;
if (!Objects.equals(this.nAccountCPCMappingid, that.nAccountCPCMappingid)) return false;