私は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>
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);
公式の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));
assertSame
は、両方のオブジェクトが同じインスタンスであるかどうかを確認します。 assertEquals
は、数値の値とスケールが等しいかどうかを確認します。つまり、1000が1000.00に等しくないことを意味します。数値のみを比較する場合は、BigDecimal
のcompareTo()
メソッドを使用する必要があります。
例えば:
BigDecimal bd1 = new BigDecimal (1000.00);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertTrue(bd1.compareTo(bd2) == 0);
BigDecimal
とcompareTo()
の比較は機能します(スケールを無視して実際の数値を比較します)が、単体テストでは実際の数値、特にテストが失敗したときを知っておくと便利です。
この場合に使用したオプションは、両方のBigDecimal
でstripTrailingZeros()
です。
assertEquals(new BigDecimal("150").stripTrailingZeros(),
otherBigDecimal.stripTrailingZeros());
この関数は、数値を変更せずにゼロを削除するため、"150"
は"1.5E+2"
に変換されます。この方法では、150
、150.00
、または他のnormalizedを同じフォームに取得するため、otherBigDecimal
でフォームを作成します。
唯一の違いは、null
のotherBigDecimal
がアサーションエラーの代わりにNullPointerException
を与えることです。
メソッドassertSame
は、両方が同じオブジェクトであることをテストします。ただし、同じ値を持つ2つのオブジェクトがあります。これをテストするには、assertEquals
を使用できます。
ただし、assertEquals
sでequals
(BigDecimal
メソッドに依存)を使用する場合、予期しない動作に注意する必要があります。たとえば、false
はequals
インスタンスのスケールも調べるため、new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10"))
はBigDecimal
と評価されます。
多くの場合、BigDecimal
メソッドを使用してcompareTo
sを比較する方が適切です。
assertTrue(bd1.compareTo(bd2) == 0);
特定のスケールおよび丸めのための他の代替:
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);
bd1
とbd2
は2つの異なるオブジェクトであり、 assertSame
はオブジェクト参照==
演算子を使用すると、そのメッセージが表示されます。ドキュメントを参照してください:
2つのオブジェクトが同じオブジェクトを参照することをアサートします。それらが同じでない場合、メッセージのない
AssertionError
がスローされます。
代わりにassertEquals
を使用する必要があります。2つのオブジェクトが等しいことを確認します-これが目的です。
==
演算子を使用して2つのBigDecimal
オブジェクトを比較すると、それらの値がキャッシュされている(0〜10の)値である限り機能します。
AssertEquals
の代わりにAssertSame
を使用してください。理由は、assertequals
は値をチェックしますが、assertsame
は参照をチェックするためです。