Java JUnit: метод X неоднозначен для типа Y - PullRequest
86 голосов
/ 28 ноября 2009

У меня были некоторые тесты, работающие нормально. Затем я переместил его в другой пакет и теперь получаю ошибки. Вот код:

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, Object) неоднозначен для типа JGraphtUtilitiesTest

Как я могу это исправить? Почему эта проблема возникла, когда я переместил класс в другой пакет?

Ответы [ 3 ]

188 голосов
/ 28 ноября 2009

Метод assertEquals (Object, Object) неоднозначен для типа ...

Что означает эта ошибка, так это то, что вы передаете double и и Double в метод с двумя разными сигнатурами: assertEquals(Object, Object) и assertEquals(double, double) оба из которых могут быть вызваны, благодаря autoboxing.

Чтобы избежать неоднозначности, убедитесь, что вы либо позвонили assertEquals(Object, Object) (передав два двойных) или assertEquals(double, double) (передав два двойных).

Итак, в вашем случае вы должны использовать:

assertEquals(Double.valueOf(70), eccen.get("alpha"));

Или:

assertEquals(70.0d, eccen.get("alpha").doubleValue());
1 голос
/ 25 апреля 2017

Вы можете использовать метод

assertEquals(double expected, double actual, double delta)

Что будет учитывать ошибку округления, которая является преградой для плавающей запятой (см., Например, этот пост ) Вы можете написать

assertEquals(70, eccen.get("alpha"), 0.0001);

Это означает, что до тех пор, пока два значения отличаются менее чем на 0,0001, они считаются равными. Это имеет два преимущества:

  • Сравнивает значения с плавающей запятой, как они должны
  • Нет необходимости приводить, так как утверждение с тремя аргументами применяется только к двойным значениям, а не к универсальным объектам
0 голосов
/ 18 марта 2018

Самое простое решение этой проблемы - просто преобразовать второй параметр в примитив:

assertEquals(70, (double)eccen.get("alpha"));

Неопределенность удалена.

Это действительно для любого из подклассов Number, например:

assertEquals(70, (int)new Integer(70));

Решил бы и двусмысленность.

Однако assertEquals (double, double) устарел на данный момент и по уважительным причинам, поэтому я рекомендую вам использовать метод с дельтой, как уже предлагали другие.

По веским причинам я имею в виду, что, учитывая внутреннее представление двойных чисел, два, по-видимому, равных двойных числа могут отличаться в несущественной бесконечно малой доле и не пройдут тест, но это не означает, что с вашим код.

...