java junit assert bigdecimal

java - Afirmar JUnit con BigDecimal



assert (8)

Quiero usar assert entre 2 dos decimales, uso esto:

BigDecimal bd1 = new BigDecimal (1000); BigDecimal bd2 = new BigDecimal (1000); org.junit.Assert.assertSame (bd1,bd2);

pero el registro de JUnit muestra:

expected <1000> was not: <1000>


El método assertSame comprueba que ambos son el mismo objeto. Sin embargo, tienes dos objetos que tienen el mismo valor. Para probar esto, puedes usar assertEquals .

Sin embargo, debe tener en cuenta algún comportamiento inesperado al usar assertEquals (que depende del método equals ) en BigDecimal s. Por ejemplo, new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10")) evalúa como false porque equals también mira la escala de las instancias de BigDecimal .

En muchas circunstancias, es mejor comparar BigDecimal s utilizando el método compareTo :

assertTrue(bd1.compareTo(bd2) == 0);


La solución oficial de Junit para afirmar que dos BigDecimal son matemáticamente iguales es usar Hamcrest.

Con java-hamcrest 2.0.0.0 podemos usar esta sintaxis:

// import static org.hamcrest.MatcherAssert.assertThat; // import org.hamcrest.Matchers; BigDecimal a = new BigDecimal("100") BigDecimal b = new BigDecimal("100.00") assertThat(a, Matchers.comparesEqualTo(b));

Hamcrest 1.3 Referencia rápida


La comparación de BigDecimal con compareTo() funciona (como en: ignora la escala y compara el número real), pero cuando la prueba de la unidad es útil saber cuál es el número real, especialmente cuando falla la prueba.

Una opción que he usado en este caso es stripTrailingZeros() en BigDecimal :

assertEquals(new BigDecimal("150").stripTrailingZeros(), otherBigDecimal.stripTrailingZeros());

Lo que hace esta función es eliminar los ceros sin cambiar el número, por lo que "150" se convierte en "1.5E+2" : de esta manera no importa si tiene 150 , 150.00 u otra forma en otherBigDecimal porque se normalizan en el misma forma

La única diferencia es que un null en otherBigDecimal daría una NullPointerException lugar de un error de aserción.


Otra alternativa para escala específica y redondeada:

import static org.assertj.core.api.Assertions.assertThat; ... BigDecimal a = new BigDecimal(100.05); BigDecimal b = new BigDecimal(100.048); a = a.setScale(2, BigDecimal.ROUND_HALF_EVEN); b = b.setScale(2, BigDecimal.ROUND_HALF_EVEN); assertThat(a).isEqualTo(b);


Use AssertEquals lugar de AssertSame ... motivo porque assertequals verifica el valor pero assertsame verifica la referencia ..


assertSame prueba que los dos objetos son los mismos objetos, es decir, que son == :

Afirma que dos objetos se refieren al mismo objeto. Si no son iguales, se lanza un error de AssertionError sin un mensaje.

En su caso, dado que bd1 y bd2 son nuevos BigDecimal , los objetos no son los mismos, de ahí la excepción.

Lo que quieres es usar assertEquals , que comprueba si dos objetos son iguales, es decir, .equals :

Afirma que dos objetos son iguales. Si no lo son, se lanza un error de AssertionError sin un mensaje. Si lo esperado y lo real son null , se consideran iguales.

BigDecimal bd1 = new BigDecimal (1000); BigDecimal bd2 = new BigDecimal (1000); org.junit.Assert.assertEquals(bd1,bd2);


assertSame comprueba si ambos objetos son la misma instancia. assertEquals verifica si los números son iguales en valor y escala, lo que significa que 1000 no es igual a 1000.00. Si desea comparar solo el valor numérico, debe usar el compareTo() de BigDecimal .

Por ejemplo:

BigDecimal bd1 = new BigDecimal (1000.00); BigDecimal bd2 = new BigDecimal (1000); org.junit.Assert.assertTrue(bd1.compareTo(bd2) == 0);


bd1 y bd2 son dos objetos diferentes , y dado que assertSame verifica la referencia del objeto usando el operador == , está recibiendo ese mensaje, consulte la documentación:

Afirma que dos objetos se refieren al mismo objeto . Si no son iguales, se lanza un error de AssertionError sin un mensaje.

Debería usar assertEquals en assertEquals lugar, verifica que los dos objetos sean iguales, que es lo que quiere.

Tenga en cuenta que la comparación de dos objetos BigDecimal con el operador == funcionará siempre que sus valores se almacenen en caché (de 0 a 10).