Ошибка AssertionFailedError при попытке сравнить два объекта из одного класса (после переопределения Equals () и Hashcode ()) - PullRequest
0 голосов
/ 18 октября 2019

В первый раз я попытался переопределить свой класс (Деньги), чтобы проверить два объекта на определенный атрибут. во второй раз я попытался проверить два одинаковых объекта из одного класса (Money), но это не сработало.

Я попробовал Overriding Equals () и Hashcode ()

В первом классе(Деньги). Вверху файла.

    public static final Money HALF_DINAR = new Money(BigDecimal.valueOf(0.50));
public BigDecimal current_Money;
    public static final Money ZERO =new Money(BigDecimal.ZERO);
    public static Money mInsideMachine = new Money(BigDecimal.ZERO);


    @Override
    public boolean equals(Object o) {

        if (o == this) return true;

        if (!(o instanceof Money)) {
            return false;
        }
        Money money = (Money) o;


        return new EqualsBuilder()
                .append(this.current_Money,money.current_Money)
                .isEquals();
    }

    @Override
    /*public int hashCode() {
        return Objects.hash(current_Money);
    }*/
    public int hashCode(){
            return new HashCodeBuilder(17, 37)
                    .append(current_Money)
                    .toHashCode();
    }

Команда, которую я использую для проверки объектов:

 assertThat(snackMachine.moneyInside()).isEqualTo(Money.HALF_DINAR);

* Обратите внимание: объект snackMachine принадлежит к классу SnackMachine, но возвращаетиз класса денег. вот код для moneyInside.

    public Money moneyInside() {
        return Money.mInsideMachine;
}

Код второго файла (неизменяемый) (класс SnackMachine) Юнит-тест

 @Test
    void buying_a_snack_after_inserting_just_enough_money_then_the_money_inside_should_equals_to_money_inserted() {
        snackMachine.insertMoney(Money.QUARTER_DINAR);
        snackMachine.insertMoney(Money.QUARTER_DINAR);

        snackMachine.buySnack(SnackType.CHEWING_GUM);

        System.out.println("Moneyinside (Unit test)"+Money.mInsideMachine.current_Money.toString());
        System.out.println("Money half dinar (Unit test)"+Money.HALF_DINAR.current_Money.toString());
        //assertThat(snackMachine.moneyInTransaction()).isEqualTo(Money.ZERO);
        assertThat(snackMachine.moneyInside()).isEqualTo(Money.HALF_DINAR);

    }

Я добавил некоторый код для печати значений ивывод:

Moneyinside (Unit test)0.50
Money half dinar (Unit test)0.5


org.opentest4j.AssertionFailedError: 
Expecting:
 <com.progressoft.induction.Money@885>
to be equal to:
 <com.progressoft.induction.Money@311>
but was not.
Expected :com.progressoft.induction.Money@311
Actual   :com.progressoft.induction.Money@885

1 Ответ

1 голос
/ 21 октября 2019

Проблема здесь в том, что 0,5 не равно 0,50, если вы не используете isEqualByComparingTo​. см. https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#compareTo-java.math.BigDecimal-

пример:

 // assertion will pass because 8.0 is equal to 8.00 using BigDecimal.compareTo(BigDecimal)
 assertThat(new BigDecimal("8.0")).isEqualByComparingTo(new BigDecimal("8.00"));
 // assertion fails 
 assertThat(new BigDecimal("8.0")).isEqualTo(new BigDecimal("8.00"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...