JUnit与BigDecimal断言

kAn*_*GeL 40 java junit assert bigdecimal

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

BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertSame (bd1,bd2);
Run Code Online (Sandbox Code Playgroud)

但是JUnit日志显示:

expected <1000> was not: <1000>
Run Code Online (Sandbox Code Playgroud)

frh*_*ack 67

断言两个BigDecimal在数学上相等的官方junit解决方案是使用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));
Run Code Online (Sandbox Code Playgroud)

Hamcrest 1.3快速参考

  • 与接受和最高投票的答案相比,这也提供了有意义的错误消息:"java.lang.AssertionError:Expected:值等于<0.22>但是:<0.222>大于<0.22>" (5认同)
  • 我真的觉得这应该是公认的答案:)。 (2认同)

End*_*ery 23

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

例如:

BigDecimal bd1 = new BigDecimal (1000.00);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertTrue(bd1.compareTo(bd2) == 0); 
Run Code Online (Sandbox Code Playgroud)

  • `compareEqualTo()`比这更好,因为在失败时,`assertThat(x.compareTo(y),is(y)`给出类似`Expected:is <0>但是:is <1>`.`assertThat(x ,compareEqualTo(y)`给出'预期:值等于<27700>但是:<6700.000>小于<27700> (3认同)
  • @slim 是的,Hamcrest 的答案给出了更有意义的错误消息。另一方面,我的答案并不依赖于 Hamcrest,并解释了为什么接受的答案可能会失败的逻辑。 (3认同)

Swe*_*ens 18

问题的答案已经给出了。但有些答案回答了另一个问题,即“如何比较 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);
Run Code Online (Sandbox Code Playgroud)

  • 这是正确答案,谢谢。到 2021 年,我们不应该像穴居人那样直接使用compareTo==0。 (2认同)

Tun*_*aki 7

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

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

在你的情况下,既然bd1bd2是新的BigDecimal,那么对象就不一样了,因此也是例外.

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

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

BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertEquals(bd1,bd2);
Run Code Online (Sandbox Code Playgroud)

  • 这将只适用于具有完全相同比例的BigDecimals (23认同)

Dan*_*ato 6

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

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

assertEquals(new BigDecimal("150").stripTrailingZeros(),
                    otherBigDecimal.stripTrailingZeros());
Run Code Online (Sandbox Code Playgroud)

什么这个函数是去除零不换号,所以"150"被转换"1.5E+2":这样,如果你有没关系150,150.00或其他形式otherBigDecimal,因为他们得到到同一个形式.

唯一的区别是nullin otherBigDecimal会给出一个NullPointerException而不是一个断言错误.


Hoo*_*pje 5

该方法assertSame测试两者是同一个对象.但是,您有两个具有相同值的对象.要测试这个,你可以使用assertEquals.

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

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

assertTrue(bd1.compareTo(bd2) == 0);
Run Code Online (Sandbox Code Playgroud)