Разница в 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);
код Double
s будет молча распакован в double
и все будет работать нормально (и тесты не выходят из строя неожиданно :-).
двойная математика редко, если когда-либо дает ровно равные результаты. Например, 0.1 * 0.1 != 0.01
. Обычно для сравнения результатов с двойной точностью требуется хотя бы Дельта.
С другой стороны, если вы сравниваете boxed Double
s, предполагается, что вы хотите точное равенство. Java не имеет значения дельты по умолчанию, но Double.equals
имеет немного другое поведение от ==
: в частности, его обработка NaNs.
этот есть смысл в тестировании, потому что Double.NaN != Double.NaN
, но в тесте, если вы ожидали NaN
и NaN
был возвращен, это правильный ответ.
источник. Утверждает, что два двойника или поплавка равны в пределах положительной дельты. Если они не являются, AssertionError выбрасывается. Если ожидаемое значение равно infinity, то дельта-значение игнорируется.Наны считаются равными.
Я бы сказал, что сравнение двойников, примитивных или объектных, бесполезно без дельты. Знание того, как работают числа точек течения, является ключом к выполнению численной работы.
объект может использоваться .равно под обложками; у примитива нет опции, кроме ==.
только потому, что версия объекта не использует дельту, не делает это лучшей идеей.
лучше напиши что-то вроде этого:
assertEquals(23.0, 250.0, 0.0)
0.0 - это Дельта. Читайте, почему ваши методы устарели.