6

Buenas. Resulta que acabo de empezar a realizar unas pruebas en JUnit a un programa que acabo de escribir y me encuentro lo siguiente:

Deprecated

Resulta que el método assertEquals se encuantra "deprecated" y creo que tiene que ver con que me de fallo continuamente al correr la prueba.

He buscado hasta en el último rincón de internet y todavía no encuentro más solución al problema que el de que cambie el import, pero el que tengo yo puesto es el mismo que todo el mundo dice que es al que hay que cambiar.

¿Alguien puede ayudarme a solucionar el problema?

Alvaro Tauroni
  • 137
  • 1
  • 2
  • 9

3 Answers3

6

Un par de cosas antes de empezar:

  • deprecated = en desuso. Quiere decir que està obsoleto y se eliminará en un futuro.
  • el metodo falla por el problema de la coma flotante tal y como ha demostrado Jose Antonio.

estas usando una version de assertEquals que ya no se recomienda su uso, tal y como indica el deprecated, en concreto:

static void assertEquals(double expected, double actual) 

De la documentacion:

Deprecated. Use assertEquals(double expected, double actual, double epsilon) instead

(traduccion libre)

En desuso. En vez de este usa assertEquals(double expected, double actual, double epsilon)

Por lo tanto, debes usar el metodo que dice (que realmente en la API tiene una firma diferente ya que a epsylon le llama delta) y asignarle un margen de error:

public static void assertEquals(double expected,
                                double actual,
                                double delta)

Por lo que, si quieres un margen de error de, por ejemplo, 0.1 para evitar problemas con la coma flotante, pues tu metodo quedaria:

Area ar = new Area();
double a = ar.Triangulo(2, 5);
assertEquals(5, a, 0.1);
joc
  • 593
  • 1
  • 7
  • 19
  • 1
    La definición de deprecated en Java es "A program element annotated @ Deprecated is one that programmers are discouraged from using, typically because it is dangerous, or because a better alternative exists." que se traduce por "Un elemento de programa anotado como @ Deprecated es aquel del que se desaconseja a los programadores que lo usen, típicamente porque es inseguro o porque hay alternativas mejores. Esto es en referencia principalmente a "Quiere decir que no està obsoleto pero lo estará en un futuro". Un elemento @ Deprecated sí está obsoleto, lo que no está es eliminado (todavía). – Anonymous Coward Aug 29 '16 at 18:45
  • gracias @jose he modificado para que quede más claro. – joc Aug 30 '16 at 08:57
3

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);
Anonymous Coward
  • 6,185
  • 4
  • 31
  • 58
0

Lo solucioné así, dando un margen de error en el "Delta "

public class CargoTest {

Cargo cargo1 = new Cargo();
Cargo cargo2 = new Cargo("profesor", 3.141516);

@Test
public void testNombreCargo() throws Exception {
    //Cuando dos cadenas no coinciden, fail test!
    cargo1.setNombre("gerente");
    // Si pongo en expected :"juerrente" -> SE PRODUCE ERROR Y MUESTRA MENSAJE
    assertEquals("Error: Cargo equicado","gerente",cargo1.getNombre());

    assertEquals("Cargo equivocado","profesor",cargo2.getNombre());

}

@Test
public void testBasicoCargo() throws Exception {
  cargo1.setBasico(0.333333E2);
    assertEquals("Error: Sueldo básico equivocado",0.333333E2,cargo1.getBasico(),1e2 );  // <-- acá 
}
}
Raul Cacacho
  • 2,285
  • 9
  • 15
  • 25
Dent007
  • 1
  • 2