Ich hatte einige Tests, die gut funktionierten. Dann habe ich es in ein anderes Paket verschoben und erhalte jetzt Fehler. Hier ist der Code:
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"));
}
Die Fehlermeldung lautet:
Die Methode assertEquals (Object, Object) ist für den Typ JGraphtUtilitiesTest nicht eindeutig
Wie kann ich das beheben? Warum ist dieses Problem aufgetreten, als ich die Klasse in ein anderes Paket verschoben habe?
Antworten:
Die Methode assertEquals (Object, Object) ist für den Typ ... nicht eindeutig.
Dieser Fehler bedeutet, dass Sie ein
double
und undDouble
an eine Methode übergeben, die zwei verschiedene Signaturen hat:assertEquals(Object, Object)
undassertEquals(double, double)
beide dank Autoboxing aufgerufen werden können.Um die Mehrdeutigkeit zu vermeiden, stellen Sie sicher, dass Sie entweder anrufen
assertEquals(Object, Object)
(indem Sie zwei Doppel übergeben) oderassertEquals(double, double)
(indem Sie zwei Doppel übergeben).In Ihrem Fall sollten Sie also Folgendes verwenden:
Oder:
quelle
assertEquals(Object, Object)
undassertEquals(double, double)
was bei JUnit 4.4, 4.5 der Fall ist. Aber wie gesagt, das Ändern der Version von JUnit ist nicht die wirkliche Lösung. Beheben Sie einfach das Problem.Sie können die Methode verwenden
Dabei werden Rundungsfehler berücksichtigt, die das Gleitkomma beeinträchtigen (siehe diesen Beitrag zum Beispiel). Du kannst schreiben
Dies bedeutet, dass die beiden Werte, solange sie sich für weniger als 0,0001 unterscheiden, als gleich angesehen werden. Dies hat zwei Vorteile:
quelle
Die einfachste Lösung für dieses Problem besteht darin, den zweiten Parameter in ein Grundelement umzuwandeln:
Mehrdeutigkeit entfernt.
Dies gilt für alle Unterklassen von Number, zum Beispiel:
Würde auch eine Mehrdeutigkeit lösen.
AssertEquals (double, double) ist jedoch ab sofort und aus guten Gründen veraltet. Ich empfehle Ihnen daher, die Methode mit einem Delta zu verwenden, wie andere bereits vorgeschlagen haben.
Mit guten Gründen meine ich, dass sich angesichts der inneren Darstellung von Doppelzahlen zwei scheinbar gleiche Doppelzahlen in einem irrelevanten infinitesimalen Bruch unterscheiden können und keinen Test bestehen würden, aber das bedeutet nicht, dass etwas mit Ihrem Code nicht stimmt.
quelle