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..