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


Tuve algunas pruebas funcionando bien. Luego, lo moví a un paquete diferente, y ahora estoy recibiendo 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 el siguiente:

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

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

Author: Georg Fritzsche, 2009-11-28

3 answers

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

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

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

Así que, en tu caso, deberías uso:

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

O:

assertEquals(70.0d, eccen.get("alpha").doubleValue());
 180
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-11 09:45:58

Puede utilizar el método

assertEquals(double expected, double actual, double delta)

Que tendrá en cuenta los errores de redondeo que son hinerent al punto flotante (ver este post por ejemplo). Puede 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 coma flotante como se supone que deben
  • No hay necesidad de emitir, ya que los tres argumentos afirman que solo se aplica a dobles, no a genérico Objetos
 0
Author: Paolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:41

La solución más simple a este problema es simplemente convertir el segundo parámetro en una primitiva:

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

Ambigüedad eliminada.

Esto es válido para cualquiera de las subclases Numéricas, por ejemplo:

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

También resolvería una ambigüedad.

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

Por buenas razones quiero decir que, dado el representación de 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 algo malo con su código.

 0
Author: Fran Marzoa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-17 22:02:45