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