web-dev-qa-db-ja.com

BigDecimalを使用したJUnitのアサート

私は2 2 10進数の間にアサートを使用したい、私はこれを使用します:

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

ただし、JUnitログには以下が表示されます。

expected <1000> was not: <1000>
38
kAnGeL

assertSame は、2つのオブジェクトが同じオブジェクトであること、つまり、それらが==

2つのオブジェクトが同じオブジェクトを参照することをアサートします。それらが同じでない場合、メッセージのないAssertionErrorがスローされます。

あなたの場合、bd1およびbd2は両方とも新しいBigDecimalであり、オブジェクトは同じではないため、例外です。

あなたが望むのは assertEquals を使用することです。2つのオブジェクトが等しいかどうかをテストします。つまり、.equals

2つのオブジェクトが等しいことをアサートします。そうでない場合、メッセージのないAssertionErrorがスローされます。期待値と実際値がnullの場合、それらは等しいと見なされます。

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

公式のjunitソリューション 2つのBigDecimalが完全に等しいと断言することは、hamcrestを使用することです。

Java-hamcrest 2.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クイックリファレンス

65
frhack

assertSameは、両方のオブジェクトが同じインスタンスであるかどうかを確認します。 assertEqualsは、数値の値とスケールが等しいかどうかを確認します。つまり、1000が1000.00に等しくないことを意味します。数値のみを比較する場合は、BigDecimalcompareTo()メソッドを使用する必要があります。

例えば:

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

BigDecimalcompareTo()の比較は機能します(スケールを無視して実際の数値を比較します)が、単体テストでは実際の数値、特にテストが失敗したときを知っておくと便利です。

この場合に使用したオプションは、両方のBigDecimalstripTrailingZeros()です。

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

この関数は、数値を変更せずにゼロを削除するため、"150""1.5E+2"に変換されます。この方法では、150150.00、または他のnormalizedを同じフォームに取得するため、otherBigDecimalでフォームを作成します。

唯一の違いは、nullotherBigDecimalがアサーションエラーの代わりにNullPointerExceptionを与えることです。

6
Daniele Segato

メソッドassertSameは、両方が同じオブジェクトであることをテストします。ただし、同じ値を持つ2つのオブジェクトがあります。これをテストするには、assertEqualsを使用できます。

ただし、assertEqualssでequalsBigDecimalメソッドに依存)を使用する場合、予期しない動作に注意する必要があります。たとえば、falseequalsインスタンスのスケールも調べるため、new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10"))BigDecimalと評価されます。

多くの場合、BigDecimalメソッドを使用してcompareTosを比較する方が適切です。

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

特定のスケールおよび丸めのための他の代替:

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

bd1bd2は2つの異なるオブジェクトであり、 assertSameオブジェクト参照==演算子を使用すると、そのメッセージが表示されます。ドキュメントを参照してください:

2つのオブジェクトが同じオブジェクトを参照することをアサートします。それらが同じでない場合、メッセージのないAssertionErrorがスローされます。

代わりにassertEqualsを使用する必要があります。2つのオブジェクトが等しいことを確認します-これが目的です。


==演算子を使用して2つのBigDecimalオブジェクトを比較すると、それらの値がキャッシュされている(0〜10の)値である限り機能します。

2
Maroun

AssertEqualsの代わりにAssertSameを使用してください。理由は、assertequalsは値をチェックしますが、assertsameは参照をチェックするためです。

0
Vikrant Kashyap