2009-11-28 6 views
71

Tuve algunas pruebas funcionando bien. Luego, lo moví a un paquete diferente, y ahora recibo errores. Aquí está el código:Java JUnit: El método X es ambiguo para el tipo Y

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 la siguiente:

Los assertEquals método (Object, Object) es ambigua para el tipo JGraphtUtilitiesTest

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

+0

decirnos cómo tu clase está declarada. Me parece como si hubiera heredado de JUnit3 y luego intentó importar estáticamente desde JUnit4. – bmargulies

+0

Sí, de hecho, tenía JUnit3 en el paquete A, y usé JUnit4 en el paquete B, donde originalmente escribí estas pruebas. Luego cambié del Paquete B al Paquete A, y surgió el problema. Pero no veo nada en esta clase que indique JUnit 3. ¿Dónde se declara eso? –

+0

@Rosarch ¿Están estas JGraphtUtilities disponibles en cualquier lugar? No puedo ver métodos para producir excentricidades en JGraphT! – Nick

Respuesta

171

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

Qué significa este error es que estás pasando un double y Double y 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 assertEquals(Object, Object) (pasando dos dobles) o assertEquals(double, double) (pasando dos dobles).

Así, en su caso, se debe utilizar:

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

O:

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

bien, o simplemente podría cambiarlo para usar JUnit 4 en lugar de JUnit 3. ¿Cómo hago eso? –

+7

La solución no es realmente cambiar de una versión a otra. En cambio, ayude al compilador y elimine la ambigüedad como sugerí. –

+1

De todos modos, no debería ser assertEquals (70.0d, eccen.get ("alpha")); ? – mhaller

0

Usted puede utilizar el método

assertEquals(double expected, double actual, double delta) 

que tendrá en cuenta el redondeo de error que son hinerent al punto flotante (vea this post por ejemplo). Puede escribir

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

Esto significa que, siempre que los dos valores difieran por menos de 0,0001, se consideran iguales. Esto tiene dos ventajas:

  • compara los valores de punto flotante, ya que se supone que
  • No hay necesidad de emitir, como la aserción de tres argumento sólo applyes a los dobles, no genéricos objetos
Cuestiones relacionadas