Frage

Ich hatte einige Tests gut funktioniert. Dann zog ich es in einem anderen Paket, und bin jetzt Fehler bekommen. 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 ist folgende:

Die Methode assertEquals (Object, Objekt) ist nicht eindeutig für den Typ JGraphtUtilitiesTest

Wie kann ich dieses Problem beheben? Warum hat dieses Problem auftreten, wie ich die Klasse zu einem anderen Paket verschoben?

War es hilfreich?

Lösung

Die Methode assertEquals (Object, Object) ist nicht eindeutig für die Art ...

Was dieser Fehler bedeutet, dass Sie eine double und und Double in ein Verfahren vorbei sind, die zwei verschiedene Signaturen hat: assertEquals(Object, Object) und assertEquals(double, double) sowohl von denen genannt werden kann, dank Autoboxing.

die Doppeldeutigkeit zu vermeiden, stellen Sie sicher, dass Sie entweder Anruf assertEquals(Object, Object) (durch zwei Doubles vorbei) oder assertEquals(double, double) (durch zwei Doppelzimmer vorbei).

Also, in Ihrem Fall sollten Sie verwenden:

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

Oder:

assertEquals(70.0d, eccen.get("alpha").doubleValue());

Andere Tipps

Sie können die Methode verwenden,

assertEquals(double expected, double actual, double delta)

Welche Rechnung Rundungsfehler stattfinden wird, die Gleitkomma hinerent sind (siehe dieser Beitrag zum Beispiel). Sie können schreiben,

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

Das bedeutet, dass, solange die beiden Werte für weniger als 0,0001 unterscheiden sie gelten als ebenbürtig sein. Dies hat zwei Vorteile:

  • Punktwerte Vergleichbar schwebend wie sie sollen
  • Keine Notwendigkeit zu werfen, da die drei Argument assert nur applyes zu verdoppelt, nicht auf generische Objekte

Die einfachste Lösung für dieses Problem ist, wirft nur den zweiten Parameter in ein primitiven:

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

Mehrdeutigkeit entfernt.

Dies gilt für jede der Anzahl Subklassen, zum Beispiel:

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

Würde eine Zweideutigkeit lösen.

Allerdings assertEquals (double, double) wird ab jetzt veraltet und aus guten Gründen, so dass ich ermutigen Sie die Methode mit einem Delta zu verwenden, wie andere bereits vorgeschlagen haben.

Mit guten Gründen, die ich meine, dass die innere Darstellung der doppelten Zahlen gegeben, zwei scheinbar gleich doppelte Zahlen in einem irrelevanten unendlich kleinen Bruchteil unterscheiden können und würden einen Test nicht passieren, aber das bedeutet nicht, dass es mit dem etwas nicht in Ordnung ist Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top