JUnit Assert with BigDecimal

后端 未结 9 1971
遇见更好的自我
遇见更好的自我 2021-02-02 05:47

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.assertSa         


        
相关标签:
9条回答
  • 2021-02-02 06:10

    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));
    

    Hamcrest 1.3 Quick Reference

    0 讨论(0)
  • 2021-02-02 06:12

    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 are null, they are considered equal.

    BigDecimal bd1 = new BigDecimal (1000);
    BigDecimal bd2 = new BigDecimal (1000);
    org.junit.Assert.assertEquals(bd1,bd2);
    
    0 讨论(0)
  • 2021-02-02 06:15

    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 BigDecimals. 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 BigDecimals by using the compareTo method:

    assertTrue(bd1.compareTo(bd2) == 0);
    
    0 讨论(0)
  • 2021-02-02 06:19

    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.

    0 讨论(0)
  • 2021-02-02 06:20

    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);
    
    0 讨论(0)
  • 2021-02-02 06:21

    Can't you just use a toString() as in :

    assertEquals("0.02", taxes.toString());
    

    where taxes is a BigDecimal.

    0 讨论(0)
提交回复
热议问题