2010-10-29 4 views
11

Gente, ¿por qué me sale el "El método assertEquals (String, Object, Object) es ambiguo para el tipo DictionaryTest" error para esta prueba JUnit?assertEquals no funciona sin el segundo parámetro de conversión

@Test 
public void testEditCard() { 
    Integer a = 10; 
    Integer b = 12; 
    Integer c = 2; 
    assertEquals("test", a-b, c); 
} 

Agregar fundición assertEquals("test", (Integer)(a-b), c); soluciona el problema.

+0

Nota: El mismo problema y solución se aplica a TestNG. – user905686

Respuesta

14

Debido a las maravillas de autoboxing y -unboxing:

assertEquals("test", /* this is an int */ a-b, /* this is an Integer */ c); 

se puede evaluar como

assertEquals(String, long, long); 
// in this case the second parameter is unboxed 
// (and the first one silently casted) 

o como

assertEquals(String, Object, Object); 
// in this case the first parameter is boxed 

Si se declara que todas las variables como int (no Entero), no debe haber ambigüedad.

+2

Tengo el mismo problema y necesito entero (no int). ¿Qué assertequals debería usar? – Kayser

5

Es porque el compilador no puede decir si desea llamar al assertEquals(String, Object, Object) o assertEquals(String, long, long). Desde a-b y c se puede forzar automáticamente a long el compilador ve una ambigüedad.

Su conversión explícita le dice al compilador que desea la versión del objeto.

Tenga en cuenta que en este caso podría usar int en lugar de Integer variables que también corregirían la ambigüedad.

+1

Al mirar la API JUnit, parece que no hay 'assertEquals (String, int, int)' que parezca extraño ... ¿me he perdido algo? ¿La gente JUnit realmente decidió forzar que todas las comprobaciones 'int' se realizaran con' long's? ¿O he leído mal la API en http://www.junit.org/apidocs/org/junit/Assert.html? –

+0

ints se pueden sustituir por longs, pero no al revés. –

+0

Sí, lo sé, parece una decisión de diseño extraña. La aritmética de enteros suele ser más rápida que la aritmética larga, aunque supongo que será menos relevante a medida que los sistemas de 32 bits se vuelvan menos comunes. Supongo que para la eficiencia de las pruebas unitarias no es tanto un problema. –

Cuestiones relacionadas