我想在两个十进制之间使用断言,我用这个:
BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertSame (bd1,bd2);
但是JUnit日志显示:
expected <1000> was not: <1000>
答案 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));
答案 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
。
在您的情况下,由于bd1
和bd2
都是新的BigDecimal
,因此对象不一样,因此也是例外。
你想要的是使用assertEquals
来测试两个对象是否相等,即.equals
:
断言两个对象是相等的。如果不是,则抛出没有消息的
AssertionError
。如果预期和实际是null
,则认为它们是平等的。
BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertEquals(bd1,bd2);
答案 3 :(得分:6)
将BigDecimal
与compareTo()
进行比较(如:它忽略比例并比较实际数字),但在进行单元测试时,了解实际数字是有用的,特别是在测试失败时。< / 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)
bd1
和bd2
是两个不同的对象,因为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。