it-swarm.com.de

Java JUnit: Die Methode X ist für den Typ Y mehrdeutig

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 mehrdeutig

Wie kann ich das beheben? Warum ist dieses Problem aufgetreten, als ich die Klasse in ein anderes Paket verschoben habe?

83
Nick Heiner

Die Methode assertEquals (Object, Object) ist für den Typ mehrdeutig ...

Dieser Fehler bedeutet, dass Sie eine double und und Double an eine Methode übergeben, die zwei unterschiedliche Signaturen aufweist: assertEquals(Object, Object) und assertEquals(double, double) die beide dank Autoboxing aufgerufen werden konnten.

Um die Mehrdeutigkeit zu vermeiden, stellen Sie sicher, dass Sie entweder assertEquals(Object, Object) (durch Übergeben von zwei Doubles) oder assertEquals(double, double) (durch Übergeben von zwei Doubles) aufrufen. 

In Ihrem Fall sollten Sie also Folgendes verwenden:

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

Oder:

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

Sie können die Methode verwenden

assertEquals(double expected, double actual, double delta)

Dabei werden Rundungsfehler berücksichtigt, die auf Fließkommazahlen hindeuten (siehe diesen Beitrag zum Beispiel). Du kannst schreiben

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

Dies bedeutet, dass, solange sich die beiden Werte um weniger als 0,0001 unterscheiden, sie als gleich betrachtet werden. Dies hat zwei Vorteile:

  • Vergleicht die Gleitkommawerte wie vorgesehen
  • Es ist nicht notwendig, das Casting anzuwenden, da die drei Argumente nur für Doubles gelten, nicht für generische Objekte
1
Paolo

Die einfachste Lösung für dieses Problem besteht darin, den zweiten Parameter in ein Grundelement umzuwandeln:

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

Mehrdeutigkeit entfernt.

Dies gilt für jede der Number-Unterklassen, zum Beispiel:

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

Würde auch eine Mehrdeutigkeit lösen.

AssertEquals (double, double) ist jedoch aus guten Gründen veraltet. Daher empfehle ich Ihnen, die Methode mit einem Delta zu verwenden, wie andere bereits vorgeschlagen haben. 

Mit guten Gründen meine ich, dass zwei scheinbar gleiche Doppelzahlen aufgrund der inneren Darstellung von doppelten Zahlen in einem irrelevanten infinitesimalen Bruch unterscheiden können und keinen Test bestehen würden.

0
Fran Marzoa