Considera este programa :
public class AritmeticaDouble {
public static void main(String[] args) {
System.out.println(a());
}
public static double a()
{
return 5.6+5.8;
}
}
Para el cual he hecho el siguiente test unitario :
import org.junit.Test;
import static org.junit.Assert.*;
public class AritmeticaDoubleTest {
@Test
public void testA() {
double result = AritmeticaDouble.a();
assertEquals(result, 11.4);
}
}
Cuando ejecuto el test me da fallo, igual que en la pregunta. Pese a que el método a()
devuelve 5.6+5.8, que es 11.4; y por lo tanto assertEquals(result, 11.4)
no debiera dar error.
¿Qué está pasando?. Vamos a ejecutar el programa, al hacerlo me imprime.....
11.399999999999999
He ahí el problema. Resulta que a()
no devuelve 11.4, sino que devuelve 11.399999999999999 y por eso assertEquals indica fallo. El motivo es que los cálculos realizados con double son inherentemente inexactos. Y por eso Assert.assertEquals(double esperado, double actual) está en desuso (deprecated), en su lugar debes utilizar Assert.assertEquals(double esperado, double actual, double tolerancia).
En general es mala idea comparar si dos doubles son iguales o no. Para hacer estas comparaciones es mejor usar una tolerancia, para eso se añadió a JUnit el nuevo assertEquals que admite una tolerancia. Cambia tu assertEquals añadiendo un parámetro de tolerancia, por ejemplo de una diezmilésima :
assertEquals( 5, a, 0.0001);