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 способ) на BigDecimals. Например,new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10")) оценивает в false, потому что equals также смотрит на масштаб BigDecimal экземпляров.
во многих случаях лучше сравнивать BigDecimals используя 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);