Java JUnit: метод X неоднозначен для типа Y
У меня были некоторые тесты работают хорошо. Затем я переместил его в другой пакет, и теперь получаю ошибки. Вот код:
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 ответа:
метод 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());
вы можете использовать метод
assertEquals(double expected, double actual, double delta)
который будет принимать во внимание ошибки округления, которые мешают с плавающей точкой (см. этот пост например). Вы можете написать
assertEquals(70, eccen.get("alpha"), 0.0001);
Это означает, что пока эти два значения отличаются менее чем 0.0001 они считаются равными. Это имеет два преимущества:
- сравнивает значения с плавающей запятой, как они должны
- не нужно бросать, как три аргумента assert применяется только к двойникам, а не к общим объектам
самое простое решение этой проблемы - просто привести второй параметр в примитив:
assertEquals(70, (double)eccen.get("alpha"));
двусмысленность снимается.
это справедливо для любого из подклассов чисел, например:
assertEquals(70, (int)new Integer(70));
решил бы двусмысленность тоже.
однако assertEquals (double, double) устарел на данный момент и по уважительным причинам, поэтому я рекомендую вам использовать метод с дельтой, как уже предлагали другие.
хорошие я имею в виду, что, учитывая внутреннее представление двойных чисел, два явно равных двойных числа могут отличаться в нерелевантной бесконечно малой доле и не пройдут тест, но это не означает, что с вашим кодом что-то не так.