102 votes

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

J'avais des tests qui fonctionnaient bien. Ensuite, je l'ai déplacé vers un autre paquet 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 s'est-il produit lorsque j'ai déplacé la classe vers un autre package ?

0 votes

Dites-nous comment votre classe est déclarée. Il me semble que vous avez hérité de JUnit3 et que vous avez essayé d'importer statiquement de JUnit4.

0 votes

Oui, en fait, j'avais JUnit3 dans le paquet A, et j'ai utilisé JUnit4 dans le paquet B, où j'ai initialement écrit ces tests. Puis je suis passé du paquet B au paquet A, et le problème est apparu. Mais je ne vois rien dans cette classe qui indiquerait JUnit 3. Où est-ce que cela est déclaré ?

0 votes

@Rosarch Ces JGraphtUtilities sont-elles disponibles quelque part ? Je ne vois pas de méthodes pour produire des excentricités dans JGraphT !

213voto

Pascal Thivent Points 295221

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

Ce que cette erreur signifie, c'est que vous passez un fichier de type double et et Double dans une méthode qui a deux signatures différentes : assertEquals(Object, Object) y assertEquals(double, double) les deux pouvant être appelés, grâce à l'autoboxing.

Pour éviter l'ambiguïté, assurez-vous que vous appelez soit 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());

0 votes

Ok, ou je pourrais juste le changer pour utiliser JUnit 4 au lieu de JUnit 3. Comment je fais ça ?

8 votes

La solution n'est pas vraiment de passer d'une version à l'autre. Il faut plutôt aider le compilateur et lever l'ambiguïté comme je l'ai suggéré.

1 votes

De toute façon, cela ne devrait-il pas être assertEquals(70.0d, eccen.get("alpha")) ; ?

3voto

Fran Points 631

La solution la plus simple à ce problème consiste à transformer le deuxième paramètre en une primitive :

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

Ambiguïté supprimée.

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

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

Cela résoudrait aussi une ambiguïté.

Cependant, assertEquals(double, double) est déprécié à partir de maintenant et pour de bonnes raisons, donc je vous encourage à 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 d'une fraction infinitésimale non pertinente et ne passeraient pas un test, mais cela ne signifie pas qu'il y a quelque chose qui cloche dans votre code.

2voto

Paolo Points 933

Vous pouvez utiliser la méthode

assertEquals(double expected, double actual, double delta)

Ce qui permettra de prendre en compte les erreurs d'arrondi qui sont indépendantes de la virgule flottante (voir ce poste par exemple). Vous pouvez écrire

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

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

  • Compare les valeurs à virgule flottante comme elles sont censées le faire.
  • Il n'est pas nécessaire d'effectuer un cast, car l'affirmation à trois arguments ne s'applique qu'aux doubles, et non aux objets génériques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X