Неоднозначный вызов метода: обе методы assertEquals(Object, Object) и assertEquals(double, double) в Assert совпадают
Я получаю следующую ошибку:
Обе версии метода assertEquals(Object, Object) в классе Assert и assertEquals(double, double) в классе Assert совпадают
Эта ошибка возникает на строке кода в моих тестах Junit
, где метод getScore()
возвращает значение типа double
:
assertEquals(2.5, person.getScore());
Вот импорт для assert в моем коде:
import static org.junit.Assert.*;
Что вызывает эту проблему и как я могу ее исправить?
4 ответ(ов)
Если вы хотите избежать приведения типов и использовать примитивные версии, вы можете получить примитивное значение из объекта-обертки. Например:
double a = 2.0;
Double b = 2.0;
assertEquals(a, b.doubleValue()); // Устарело, используйте метод с дельтой
Integer c = 2;
int d = 2;
assertEquals(c.intValue(), d);
Long e = 2L;
long f = 2L;
assertEquals(e.longValue(), f);
Таким образом, вы можете безопасно сравнивать примитивные значения и их соответствующие обертки, не прибегая к явному приведению типов.
У меня была такая же ошибка. Я изменил код с такого:
assertEquals("Server status code is: " + wmResp.getStatusCode(), 200, wmResp.getStatusCode());
На такой:
assertEquals("Server status code is: " + wmResp.getStatusCode(), Integer.valueOf(200), wmResp.getStatusCode());
Это происходит, потому что в первой строке компилятор воспринимает 200 как примитивный тип (int), а не как объект класса Integer.
Ваш метод getScore()
возвращает Double
, а не double
. Поэтому компилятор запутывается: ему нужно решить, следует ли преобразовать оба аргумента в Object
, или же преобразовывать только Double
в double
.
Рассмотрим ваш код:
double a = 2.0;
Double b = 2.0;
// assertEquals(a,b); // не компилируется
// компилятор не знает, что использовать
assertEquals((Object) a, (Object) b); // ОК
// или
assertEquals(a, (double) b); // ОК
В любом случае, я бы рекомендовал изменить возвращаемый тип метода на примитивный тип double
. Это поможет избежать путаницы и сделает ваш код более читаемым и понятным.
Если вас интересует использование метода Assert.assertEquals(double, double)
(примитивной версии), попробуйте вызвать перегруженный метод, который позволяет задавать допустимое отклонение, установив его в ноль, например так:
assertEquals(2.5, person.getScore(), 0.0);
Также вы можете установить третий параметр равным чему-то, отличному от нуля, если значение person.getScore()
может немного отличаться от 2.5
. Например, если значение 2.500001
допустимо, тогда ваш тест будет выглядеть следующим образом:
assertEquals(2.5, person.getScore(), 0.000001);
Как проверить, что в JUnit-тестах выбрасывается определенное исключение?
Как передать объект из одной активности в другую на Android
Как проверить, что конкретный метод не был вызван, используя Mockito?
Как красиво форматировать числа с плавающей запятой в строку без лишних нулей после запятой
Можно ли создать экземпляр абстрактного класса?