web-dev-qa-db-fra.com

Java JUnit: la méthode X est ambiguë pour le type Y

Certains tests ont bien fonctionné. Ensuite, je l'ai déplacé dans un paquet différent et je reçois maintenant des erreurs. Voici le 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"));
    }

Le message d'erreur est le suivant:

La méthode assertEquals (Object, Object) est ambiguë pour le type JGraphtUtilitiesTest

Comment puis-je réparer cela? Pourquoi ce problème est-il survenu lorsque j'ai déplacé la classe vers un autre package?

83
Nick Heiner

La méthode assertEquals (Object, Object) est ambiguë pour le type ...

Cette erreur signifie que vous passez double et et Double à une méthode comportant deux signatures différentes: assertEquals(Object, Object) et assertEquals(double, double) qui pourraient être appelés, grâce à la recherche automatique.

Pour éviter toute ambiguïté, veillez à appeler assertEquals(Object, Object) (en passant deux doubles) ou assertEquals(double, double) (en passant deux doubles). 

Donc, dans votre cas, vous devriez utiliser:

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

Ou:

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

Vous pouvez utiliser la méthode

assertEquals(double expected, double actual, double delta)

Ce qui prendra en compte les erreurs d’arrondi qui sont mineures en virgule flottante (voir cet article par exemple) Tu peux écrire

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

Cela signifie que tant que les deux valeurs diffèrent pour moins de 0,0001, elles sont considérées comme égales. Cela présente deux avantages:

  • Compare les valeurs en virgule flottante comme elles sont supposées
  • Pas besoin de transtyper car l'affirmation des trois arguments ne s'applique qu'aux doublons, pas aux objets génériques
1
Paolo

La solution la plus simple à ce problème consiste à convertir le second paramètre en primitive:

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

Ambiguïté supprimée.

Ceci est valable pour toutes les sous-classes Number, par exemple:

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

Cela résoudrait aussi une ambiguïté.

Cependant, assertEquals (double, double) est obsolète dès maintenant et pour de bonnes raisons. Je vous encourage donc à utiliser la méthode avec un delta, comme d'autres l'ont déjà suggéré. 

Par bonnes raisons, je veux dire que, étant donné la représentation interne des nombres doubles, deux nombres doubles apparemment égaux peuvent différer par une fraction infinitésimale non pertinente et ne réussiraient pas un test, mais cela ne signifie pas que votre code est défectueux.

0
Fran Marzoa