Разница в JUnit между assertEquals(двойной) и assertEquals(двухместный, двухместный с двуспальной кроватью, Дельта)

У меня был тест junit, утверждающий два двойных объекта со следующим:

Assert.assertEquals(Double expected, Double result);

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

Итак, мне интересно, в чем разница между использованием двойного объекта или примитивного типа в этом assertEquals? Почему использование объектов без дельты нормально, но затем использование примитивов без дельты нерекомендуемый? Java делает что-то в фоновом режиме, который уже имеет значение дельты по умолчанию, учтенное?

спасибо.

5 ответов


нет метод assert в JUnit с подписью

assertEquals(Double expected, Double result);

есть один, однако, общий для объектов:

assertEquals(Object expected, Object result);

это вызывает объекты'equals метод и как вы можете ожидать, это не рекомендуется использовать это для сравнения Double объекты.

для двойников, как вы заметили, абсолютно необходимо использовать дельту для сравнения, чтобы избежать проблем с округлением с плавающей запятой (объяснено уже в некоторых других находить ответы.) Если вы используете 3-аргументную версию assertEquals С double аргументы

assertEquals(double expected, double actual, double delta);

код Doubles будет молча распакован в double и все будет работать нормально (и тесты не выходят из строя неожиданно :-).


двойная математика редко, если когда-либо дает ровно равные результаты. Например, 0.1 * 0.1 != 0.01. Обычно для сравнения результатов с двойной точностью требуется хотя бы Дельта.

С другой стороны, если вы сравниваете boxed Doubles, предполагается, что вы хотите точное равенство. Java не имеет значения дельты по умолчанию, но Double.equals имеет немного другое поведение от ==: в частности, его обработка NaNs.

этот есть смысл в тестировании, потому что Double.NaN != Double.NaN, но в тесте, если вы ожидали NaN и NaN был возвращен, это правильный ответ.


источник. Утверждает, что два двойника или поплавка равны в пределах положительной дельты. Если они не являются, AssertionError выбрасывается. Если ожидаемое значение равно infinity, то дельта-значение игнорируется.Наны считаются равными.


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

объект может использоваться .равно под обложками; у примитива нет опции, кроме ==.

только потому, что версия объекта не использует дельту, не делает это лучшей идеей.


лучше напиши что-то вроде этого:

assertEquals(23.0, 250.0, 0.0)  

0.0 - это Дельта. Читайте, почему ваши методы устарели.