Java JUnit: il metodo X è ambiguo per il tipo Y
-
06-07-2019 - |
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?
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.