JUnit与BigDecimal断言

时间:2016-02-23 09:08:48

标签: java junit assert bigdecimal

我想在两个十进制之间使用断言,我用这个:

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

但是JUnit日志显示:

expected <1000> was not: <1000>

10 个答案:

答案 0 :(得分:50)

断言两个BigDecimal在数学上相等的official junit solution是使用hamcrest。

使用java-hamcrest 2.0.0.0,我们可以使用以下语法:

    // 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

答案 1 :(得分:21)

assertSame检查两个对象是否是同一个实例。 assertEquals检查数字和值是否相等,即1000不等于1000.00。如果您只想比较数值,则应使用compareTo()中的BigDecimal方法。

例如:

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

答案 2 :(得分:6)

assertSame测试两个对象是相同的对象,即它们是==

  

断言两个对象引用同一个对象。如果它们不相同,则抛出没有消息的AssertionError

在您的情况下,由于bd1bd2都是新的BigDecimal,因此对象不一样,因此也是例外。

你想要的是使用assertEquals来测试两个对象是否相等,即.equals

  

断言两个对象是相等的。如果不是,则抛出没有消息的AssertionError。如果预期和实际是null,则认为它们是平等的。

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

答案 3 :(得分:6)

BigDecimalcompareTo()进行比较(如:它忽略比例并比较实际数字),但在进行单元测试时,了解实际数字是有用的,特别是在测试失败时。< / p>

我在这种情况下使用的选项是stripTrailingZeros()上的BigDecimal

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

此功能的作用是删除零而不更改数字,因此"150"转换为"1.5E+2":这样,如果您有150,{{1}则无关紧要}或150.00中的其他形式,因为它们将规范化转换为相同的形式。

唯一的区别是otherBigDecimal中的null会给出otherBigDecimal而不是断言错误。

答案 4 :(得分:5)

方法assertSame测试两者是同一个对象。但是,您有两个具有相同值的对象。要对此进行测试,您可以使用assertEquals

但是,在assertEquals上使用equals(取决于BigDecimal方法)时,您应该注意一些意外行为。例如,new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10"))评估为false,因为equals也会查看BigDecimal个实例的比例。

在许多情况下,最好使用BigDecimal方法比较compareTo

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

答案 5 :(得分:3)

特定比例和四舍五入的其他替代方案:

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

答案 6 :(得分:2)

bd1bd2是两个不同的对象,因为assertSame使用{{1}检查对象引用运营商,您正在收到该消息,请参阅文档:

  

断言两个对象引用同一个对象。如果它们不相同,则会抛出没有消息的==

您应该使用AssertionError代替,它会检查两个对象是否相等 - 这就是您想要的。

请注意,使用assertEquals运算符比较两个BigDecimal对象只要它们的值被缓存(0到10)值就会起作用。

答案 7 :(得分:1)

问题的答案已经给出。但有些答案回答了另一个问题,即“如何比较 2 个 BigDecimals?”。迄今为止给出的解决方案要么是错误的,要么是过时的。我想建议试试这个:

// import static org.assertj.core.api.Assertions.assertThat;

BigDecimal a = new BigDecimal("100")
BigDecimal b = new BigDecimal("100.00")
assertThat(a).isEqualByComparingTo(b);

答案 8 :(得分:0)

使用AssertEquals代替AssertSame ...因为assertequals会检查值,但assertsame会检查参考值。

答案 9 :(得分:0)

您不能只使用toString()?

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

其中税收是BigDecimal。