Domanda

Ho avuto alcuni test funzionanti. Quindi, l'ho spostato in un pacchetto diverso e ora ricevo errori. Ecco il codice:

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"));
    }

Il messaggio di errore è questo:

Il metodo assertEquals (Object, Object) è ambiguo per il tipo JGraphtUtilitiesTest

Come posso risolvere questo problema? Perché questo problema si è verificato quando ho spostato la classe in un pacchetto diverso?

È stato utile?

Soluzione

Il metodo assertEquals (Object, Object) è ambiguo per il tipo ...

Che cosa significa questo errore è che stai passando un doppio e un doppio in un metodo che ha due firme diverse: assertEquals (Object, Object) e assertEquals (double, double) che entrambi possono essere chiamati, grazie all'autoboxing.

Per evitare l'ambiguità, assicurati di chiamare assertEquals (Object, Object) (passando due doppi) o assertEquals (double, double) (passando due doppie).

Quindi, nel tuo caso, dovresti usare:

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

o

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

Altri suggerimenti

Puoi usare il metodo

assertEquals(double expected, double actual, double delta)

Che terrà conto dell'errore di arrotondamento che è hinerent in virgola mobile (vedere questo post per esempio). Puoi scrivere

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

Ciò significa che fino a quando i due valori differiscono per meno di 0,0001 sono considerati uguali. Questo ha due vantaggi:

  • Confronta i valori in virgola mobile come dovrebbero
  • Non è necessario eseguire il cast, poiché l'affermazione dei tre argomenti si applica solo ai doppi, non agli oggetti generici

La soluzione più semplice a questo problema è semplicemente il cast del secondo parametro in una primitiva:

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

Ambiguità rimossa.

Questo è valido per qualsiasi sottoclasse di numeri, ad esempio:

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

Anche risolverebbe un'ambiguità.

Tuttavia, assertEquals (double, double) è ormai obsoleto e per buoni motivi, quindi ti incoraggio a usare il metodo con un delta come altri hanno già suggerito.

Per buone ragioni intendo che, data la rappresentazione interna dei doppi numeri, due numeri doppi apparentemente uguali possono differire in una frazione infinitesimale irrilevante e non superare un test, ma ciò non significa che ci sia qualcosa di sbagliato nel tuo codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top