Reputation: 863
I want to use assert between 2 two decimal, I use this:
BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertSame (bd1,bd2);
but the JUnit log shows:
expected <1000> was not: <1000>
Upvotes: 85
Views: 93863
Reputation: 4415
I am retriving Bigdecimal from Map and assertion using assertEquals & assertTrue. Decimal values are setusing setScale() method.
Map<String, BigDecimal> amtAdjustedMap = new HashMap<>();
Assertions.assertEquals(amtAdjustedMap.get("amtAdjustedLcy"),new BigDecimal(100000));
Assertions.assertEquals(amtAdjustedMap.get("amtAdjustedFxRate"),new BigDecimal(7.81676).setScale(5, RoundingMode.HALF_UP));
Assertions.assertEquals(amtAdjustedMap.get("fxRateAdjustment"),BigDecimal.ONE);
Assertions.assertTrue(amtAdjustedMap.get("amtAdjustedLcy").compareTo(new BigDecimal(100000))==0);
Assertions.assertTrue(amtAdjustedMap.get("amtAdjustedFxRate").compareTo(new BigDecimal(7.81676).setScale(5, RoundingMode.HALF_UP))==0);
Assertions.assertTrue(amtAdjustedMap.get("fxRateAdjustment").compareTo(BigDecimal.ONE)==0);
BigDecimal bd1= new BigDecimal ("7.2");
BigDecimal bd2= new BigDecimal ("7.2");
Assertions.assertTrue(bd1.compareTo(bd2) == 0);
Upvotes: 0
Reputation: 41
If you like the assertEquals because it shows you the values in the failure message, and you want to ignore extraneous trailing decimal zeros, you can use the following:
BigDecimal bdGood = BigDecimal.valueOf(2.5).setScale(3);
BigDecimal bdBad = BigDecimal.valueOf(2.504);
assertEquals("Passes", BigDecimal.valueOf(2.5), bdGood.stripTrailingZeros());
assertEquals("Fails", BigDecimal.valueOf(2.5), bdBad.stripTrailingZeros());
This will reduce the result to the lowest possible scale before the comparison.
Upvotes: 0
Reputation: 111
assertThat(BigDecimal.valueOf(10.00)).isEqualByComparingTo(BigDecimal.valueOf(10));
Upvotes: 2
Reputation: 480
The answer to the question was already given. But some of the answers answer another question, namely 'how to compare 2 BigDecimals?'. The given solutions so far are either wrong or obsolete. I would like to suggest to try this:
// import static org.assertj.core.api.Assertions.assertThat;
BigDecimal a = new BigDecimal("100")
BigDecimal b = new BigDecimal("100.00")
assertThat(a).isEqualByComparingTo(b);
Upvotes: 24
Reputation: 4817
Other alternative for specific scale and rounded:
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);
Upvotes: 3
Reputation: 5112
The official junit solution to assert that two BigDecimal are matematically equal is to use hamcrest.
With java-hamcrest 2.0.0.0 we can use this syntax:
// 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));
Upvotes: 142
Reputation: 12899
Comparing BigDecimal
with compareTo()
works (as in: it ignore the scale and compare the actual number) but when unit testing it's useful to know what's the actual number, specially when the test fail.
An option I've used in this case is stripTrailingZeros()
on both BigDecimal
:
assertEquals(new BigDecimal("150").stripTrailingZeros(),
otherBigDecimal.stripTrailingZeros());
What this function does is remove zeroes without changing the number, so "150"
is converted in "1.5E+2"
: this way it doesn't matter if you have 150
, 150.00
or other form in otherBigDecimal
because they get normalized into the same form.
The only difference is a null
in otherBigDecimal
would give a NullPointerException
instead of an assertion error.
Upvotes: 17
Reputation: 12932
The method assertSame
tests that both are the same object. However, you have two objects which have the same value. To test this, you can use assertEquals
.
However, you should be aware of some unexpected behavior when using assertEquals
(which depends on the equals
method) on BigDecimal
s. For example, new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10"))
evaluates to false
because equals
also looks at the scale of the BigDecimal
instances.
In many circumstances it is better to compare BigDecimal
s by using the compareTo
method:
assertTrue(bd1.compareTo(bd2) == 0);
Upvotes: 8
Reputation: 1128
assertSame
checks if both objects are the same instance. assertEquals
checks if the numbers are equal in value and scale, that means i.e. 1000 is not equal to 1000.00. If you want to compare only the numeric value, you should use compareTo()
method from BigDecimal
.
For example:
BigDecimal bd1 = new BigDecimal (1000.00);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertTrue(bd1.compareTo(bd2) == 0);
Upvotes: 50
Reputation: 95978
bd1
and bd2
are two different objects, and since assertSame
checks the object reference using the ==
operator, you're getting that message, see the docs:
Asserts that two objects refer to the same object. If they are not the same, an
AssertionError
without a message is thrown.
You should use assertEquals
instead, it checks that the two objects are equal - which is what you want.
Note that comparing two BigDecimal
objects using the ==
operator will work as long as their values are cached (for 0 through 10) values.
Upvotes: 1
Reputation: 6856
Use AssertEquals
instead of AssertSame
... reason because assertequals
checks the value but assertsame
checks the refrence..
Upvotes: -1
Reputation: 137184
assertSame
tests that the two objects are the same objects, i.e. that they are ==
:
Asserts that two objects refer to the same object. If they are not the same, an
AssertionError
without a message is thrown.
In your case, since bd1
and bd2
are both new BigDecimal
, the objects aren't the same, hence the exception.
What you want is to use assertEquals
, that tests if two objects are equal, i.e. .equals
:
Asserts that two objects are equal. If they are not, an
AssertionError
without a message is thrown. If expected and actual arenull
, they are considered equal.
BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertEquals(bd1,bd2);
Upvotes: 11