Почему при сравнении значений одного и того же объекта оператор if или assertj всегда выдает ошибку? - PullRequest
0 голосов
/ 17 октября 2019

Я вычитал два объекта, используя другой класс, но когда я возвращаю новое значение и сравниваю с ожидаемым значением, он выдает ошибку, даже если это одно и то же значение (я думаю).

Я пытался использовать, еслиоператор, но то же самое.

   if(expected.current_Money.toString().equals(0.5)){
        System.out.println(" if statmenet is working...");

    }
    else
    {
        System.out.println("failed");
    }

Импорт в этот первый класс (предпочитайте не изменять его).

   import org.assertj.core.api.ThrowableAssert;
   import org.junit.jupiter.api.Test;
   import java.math.BigDecimal;

   import static org.assertj.core.api.Assertions.assertThat;
   import static org.assertj.core.api.Assertions.assertThatThrownBy;

В том же файле у нас есть этот метод.

@Test
void subtract_two_money_should_be_correct() {
    Money oneDinar = new Money(BigDecimal.valueOf(1));
    Money halfDinar = new Money(BigDecimal.valueOf(0.5));
    System.out.println("Value of oneDinar 
    "+oneDinar.current_Money.toString());
    System.out.println("Value of halfDinar 
    "+halfDinar.current_Money.toString());

    //Money expected = oneDinar.subtract(halfDinar);
    Money expected = new Money(BigDecimal.valueOf(0.5));

    System.out.println("the Value of Expected 
    "+expected.current_Money.toString());

    assertThat(expected).isEqualTo(new Money(BigDecimal.valueOf(0.5)));
}

Вывод вычитаемого сохраняется в объект и имеет переменную внутри имеет тип данных BigDecimal.

В другом файле. Импорт

import java.math.BigDecimal;

У нас есть эти поля (переменные внутри второго класса.

    public static final Money HALF_DINAR = new 
  Money(BigDecimal.valueOf(0.5));


    public static final Money QUARTER_DINAR = new 
  Money(BigDecimal.valueOf(0.25)) ;
    public static final Money DINAR = new Money(BigDecimal.valueOf(1));
    public BigDecimal current_Money;

Вот последнее, метод, который мы использовали для вычитания.

  public Money subtract(Money SubtractMoney) {
            System.out.println("TheValue of current money "+current_Money.toString());
            Money current = new Money(current_Money);
            System.out.println("TheValue of current  "+current.current_Money.toString());

            BigDecimal subtractedNumber = current_Money.subtract(new BigDecimal(String.valueOf(SubtractMoney.current_Money)));
            System.out.println("TheValue of subtractedNumber"+subtractedNumber.toString());

            Money newMoney = new Money(subtractedNumber);
            System.out.println("TheValue of newMoney "+newMoney.current_Money.toString());

            return newMoney ;
        }

Я ожидаю, что выходные данные будут такими же, как у этого объекта (в цифрах то же самое, но это неправильно, даже если я использовал оператор if или Assertthat.

Я ожидаю, что вывод верен и ошибок нет. число равно 0,5, что является целью.

Вывод:

Value of oneDinar 1
Value of halfDinar 0.5
TheValue of current money 1
TheValue of current  1
TheValue of subtractedNumber0.5
TheValue of newMoney 0.5
the Value of Expected 0.5

org.opentest4j.AssertionFailedError: 
Expecting:
 <com.progressoft.induction.Money@123f1134>
to be equal to:
 <com.progressoft.induction.Money@7d68ef40>
but was not.
Expected :com.progressoft.induction.Money@7d68ef40
Actual   :com.progressoft.induction.Money@123f1134

1 Ответ

0 голосов
/ 17 октября 2019

Функция isEqualTo(...) в AssertJ использует метод равенства объектов для определения равенства. Поэтому вы должны переопределить метод equals() в вашем классе Money. Затем вы можете сравнивать экземпляры по содержимому, а не по идентификатору объекта, т. Е. Если значение одинаковое, экземпляры считаются равными.

Сравнение в вашем операторе if (expected.current_Money.toString().equals(0.5)) не работает, потому что expected.current_Money.toString()part является строкой, а 0.5 автоматически упаковывается в объект Double. Поэтому сравнение равно не удается, поскольку классы разные.

Примечание : при переопределении метода equals() необходимо также переопределить функцию hashcode(), чтобы она соответствовала equals()функция. В противном случае многие классы (например, HashMap) могут вести себя неправильно, поскольку они предполагают, что равно, и хэш-код работает на основе тех же предположений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...