Niektóre testy działały dobrze. Następnie przeniosłem go do innego pakietu i teraz pojawiają się błędy. Oto kod:
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"));
}
Komunikat o błędzie jest następujący:
Metoda assertEquals (Object, Object) jest niejednoznaczna dla typu JGraphtUtilitiesTest
Jak mogę to naprawić? Dlaczego wystąpił ten problem, gdy przeniosłem klasę do innego pakietu?
Odpowiedzi:
Metoda assertEquals (Object, Object) jest niejednoznaczna dla typu ...
Ten błąd oznacza, że przekazujesz
double
i iDouble
do metody, która ma dwa różne sygnatury:assertEquals(Object, Object)
iassertEquals(double, double)
oba można wywołać dzięki autoboxingowi.Aby uniknąć dwuznaczności, upewnij się, że sprawdzasz (przekazując dwa dubli)
assertEquals(Object, Object)
lubassertEquals(double, double)
(przekazując dwa dublety).Tak więc w twoim przypadku powinieneś użyć:
Lub:
źródło
assertEquals(Object, Object)
a takassertEquals(double, double)
jest w przypadku JUnit 4.4, 4.5. Ale jak powiedziałem, zmiana wersji JUnit nie jest prawdziwym rozwiązaniem, po prostu napraw problem.Możesz użyć metody
Który weźmie pod uwagę błąd zaokrąglania, który jest hinerent do zmiennoprzecinkowego (zobacz na przykład ten post ). Możesz pisać
Oznacza to, że tak długo, jak te dwie wartości różnią się o mniej niż 0,0001, są uważane za równe. Ma to dwie zalety:
źródło
Najprostszym rozwiązaniem tego problemu jest po prostu rzutowanie drugiego parametru na prymityw:
Usunięto niejednoznaczność.
Dotyczy to wszystkich podklas Number, na przykład:
Rozwiązałoby to również niejednoznaczność.
Jednak metoda assertEquals (double, double) jest obecnie przestarzała i nie bez powodu, dlatego zachęcam do korzystania z metody z deltą, jak sugerowali już inni.
Z dobrych powodów mam na myśli to, że biorąc pod uwagę wewnętrzną reprezentację liczb podwójnych, dwie pozornie równe liczby podwójne mogą różnić się nieistotnym, nieskończenie małym ułamkiem i nie przejdą testu, ale to nie znaczy, że coś jest nie tak z twoim kodem.
źródło