JUnit Assert с BigDecimal
Я хочу использовать assert между двумя двумя десятичными знаками, я использую это:
BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertSame (bd1,bd2);
но журнал JUnit показывает:
expected <1000> was not: <1000>
Ответы
Ответ 1
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);
Ответ 2
официальное решение junit, чтобы утверждать, что два BigDecimal являются математически равными - использовать 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
Ответ 3
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);
Ответ 4
Сравнение BigDecimal
с compareTo()
работает (как в: оно игнорирует масштаб и сравнивает фактическое число), но при модульном тестировании полезно знать, что такое фактическое число, особенно когда тест терпит неудачу.
Вариант, который я использовал в этом случае, stripTrailingZeros()
на обоих BigDecimal
:
assertEquals(new BigDecimal("150").stripTrailingZeros(),
otherBigDecimal.stripTrailingZeros());
Эта функция выполняет удаление нулей без изменения номера, поэтому "150"
преобразуется в "1.5E+2"
: это не имеет значения, если у вас есть 150
, 150.00
или другая форма в otherBigDecimal
потому что они нормализуются в одну и ту же форму.
Единственное различие заключается в том, что null
в otherBigDecimal
будет давать NullPointerException
вместо ошибки утверждения.
Ответ 5
Метод assertSame
проверяет, что оба являются одним и тем же объектом. Однако у вас есть два объекта с одинаковым значением. Чтобы проверить это, вы можете использовать assertEquals
.
Однако вы должны знать о некотором неожиданном поведении при использовании assertEquals
(который зависит от метода equals
) на BigDecimal
s. Например, new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10"))
оценивается как false
, потому что equals
также просматривает масштаб экземпляров BigDecimal
.
Во многих случаях лучше сравнить BigDecimal
с помощью метода compareTo
:
assertTrue(bd1.compareTo(bd2) == 0);
Ответ 6
bd1
и bd2
- два разных объекта, и поскольку assertSame
проверяет ссылку на объект с помощью оператора ==
вы получаете это сообщение, см. документы:
Утверждает, что два объекта относятся к одному и тому же объекту. Если они не совпадают, генерируется AssertionError
без сообщения.
Вместо этого вы должны использовать assertEquals
, он проверяет, что оба объекта равны - это то, что вы хотите.
Обратите внимание, что сравнение двух объектов BigDecimal
с использованием оператора ==
будет работать до тех пор, пока их значения будут кэшироваться (для значений от 0 до 10).
Ответ 7
Используйте AssertEquals
вместо AssertSame
... reason, потому что AssertEquals
проверяет значение, но AssertSame
проверяет refrence..