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));
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 sonnull
, 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).