Java JUnit:Метод X неоднозначен для типа Y
-
06-07-2019 - |
Вопрос
У меня было несколько тестов, которые работали нормально.Затем я переместил его в другой пакет, и теперь получаю ошибки.Вот этот код:
import static org.junit.Assert.*;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.jgrapht.Graphs;
import org.jgrapht.WeightedGraph;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.SimpleWeightedGraph;
import org.junit.*;
@Test
public void testEccentricity() {
WeightedGraph<String, DefaultWeightedEdge> g = generateSimpleCaseGraph();
Map<String, Double> eccen = JGraphtUtilities.eccentricities(g);
assertEquals(70, eccen.get("alpha"));
assertEquals(80, eccen.get("l"));
assertEquals(130, eccen.get("l-0"));
assertEquals(100, eccen.get("l-1"));
assertEquals(90, eccen.get("r"));
assertEquals(120, eccen.get("r-0"));
assertEquals(130, eccen.get("r-1"));
}
Сообщение об ошибке выглядит следующим образом:
Метод assertEquals(Object, Объект) неоднозначен для типа jgraphtutilitiestestest
Как я могу это исправить?Почему эта проблема возникла, когда я перенес класс в другой пакет?
Решение
Метод assertEquals(Object, Объект) неоднозначен для данного типа ...
Эта ошибка означает, что вы передаете double
и и Double
в метод, который имеет две разные сигнатуры: assertEquals(Object, Object)
и assertEquals(double, double)
и то, и другое можно было бы назвать благодаря автоматической упаковке.
Чтобы избежать двусмысленности, убедитесь, что вы либо вызываете assertEquals(Object, Object)
(путем передачи двух дублей) или assertEquals(double, double)
(пропуская два дубля).
Итак, в вашем случае вам следует использовать:
assertEquals(Double.valueOf(70), eccen.get("alpha"));
Или:
assertEquals(70.0d, eccen.get("alpha").doubleValue());
Другие советы
Вы можете использовать этот метод
assertEquals(double expected, double actual, double delta)
Который будет учитывать ошибку округления, отличную от ошибки с плавающей запятой (см. этот пост например).Вы можете написать
assertEquals(70, eccen.get("alpha"), 0.0001);
Это означает, что до тех пор, пока два значения отличаются менее чем на 0,0001, они считаются равными.Это имеет два преимущества:
- Сравнивает значения с плавающей запятой так, как они должны быть
- Нет необходимости приводить, так как три аргумента assert применяются только к двойникам, а не к универсальным объектам
Самое простое решение этой проблемы - просто преобразовать второй параметр в примитив:
assertEquals(70, (double)eccen.get("alpha"));
Неопределенность удалена.
Это действительно для любого из подклассов Number, например:
assertEquals(70, (int)new Integer(70));
Решил бы и двусмысленность.
Однако, assertEquals (double, double) устарел на данный момент и по веским причинам, поэтому я рекомендую вам использовать метод с дельтой, как уже предлагали другие. Р>
По веским причинам я имею в виду, что, учитывая внутреннее представление двойных чисел, два, по-видимому, равных двойных числа могут отличаться в несущественной бесконечно малой доле и не пройдут тест, но это не означает, что с вашим код.