software java testing junit compiler-errors package

software - Java JUnit: el método X es ambiguo para el tipo Y



junit software (3)

Tuve algunas pruebas funcionando bien. Luego, lo moví a un paquete diferente, y ahora recibo errores. Aquí está el código:

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

El mensaje de error es este:

El método assertEquals (Object, Object) es ambiguo para el tipo JGraphtUtilities Test

¿Cómo puedo arreglar esto? ¿Por qué ocurrió este problema cuando moví la clase a un paquete diferente?


El método assertEquals (Object, Object) es ambiguo para el tipo ...

Lo que significa este error es que está pasando un double y un Double en un método que tiene dos firmas diferentes: assertEquals(Object, Object) y assertEquals(double, double) ambos podrían llamarse, gracias al autoboxing.

Para evitar la ambigüedad, asegúrese de llamar a assertEquals(Object, Object) (pasando dos dobles) o assertEquals(double, double) (pasando dos dobles).

Entonces, en tu caso, debes usar:

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

O:

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


La solución más simple para este problema es simplemente convertir el segundo parámetro en un primitivo:

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

Ambigüedad eliminada.

Esto es válido para cualquiera de las subclases Number, por ejemplo:

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

Resolvería una ambigüedad también.

Sin embargo, assertEquals (doble, doble) está obsoleto a partir de ahora y por buenas razones, por lo que le recomiendo usar el método con un delta como ya han sugerido otros.

Por buenas razones me refiero a que, dada la representación interna de los números dobles, dos números dobles aparentemente iguales pueden diferir en una fracción infinitesimal irrelevante y no pasarían una prueba, pero eso no significa que haya algún problema con el código.


Puedes usar el método

assertEquals(double expected, double actual, double delta)

Que tendrá en cuenta el error de redondeo que son hinerent a coma flotante (vea esta publicación, por ejemplo). Puedes escribir

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

Esto significa que mientras los dos valores difieran por menos de 0.0001 se consideran iguales. Esto tiene dos ventajas:

  • Compara los valores de punto flotante como se supone que deben
  • No es necesario lanzar, ya que los tres argumentos afirman que solo se aplica a los dobles, no a los objetos genéricos.