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

Hamcrest 1.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); 

сравнение 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);