Question

J'ai eu des tests qui fonctionnaient bien. 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ésoudre ce problème? Pourquoi ce problème est-il survenu lorsque j'ai déplacé la classe dans un autre package?

Était-ce utile?

La solution

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

Cette erreur signifie que vous passez un double et un Double à une méthode comportant deux signatures différentes: assertEquals (Object, Object) et assertEquals (double, double) , tous deux pouvant être appelés, grâce à la sélection 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());

Autres conseils

Vous pouvez utiliser la méthode

assertEquals(double expected, double actual, double delta)

Ce qui prendra en compte les erreurs d’arrondi qui sont proches de la virgule flottante (voir cet article par exemple). Vous pouvez é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, l'assertion de trois arguments ne s'appliquant qu'aux doubles, pas aux objets génériques

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

Résoudreait également 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, compte tenu de la représentation interne des nombres doubles, deux nombres doubles apparemment égaux peuvent différer par une fraction infinitésimale non pertinente et ne passeraient pas le test, mais cela ne signifie pas qu'il y a un problème avec votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top