Как написать идеальный код для бросаемого исключения отрицательного числа? Использование assertThatThrownBy - PullRequest
1 голос
/ 18 октября 2019

У меня есть модульный тест, и я хочу выдать исключение (потому что он всегда будет выдавать этот модульный тест).

Я пытаюсь использовать try и catch, но я не знаю, что должноЯ делаю после.

В модульном тесте (из первого класса).

@Test
void subtract_money_from_smaller_money_should_fail() {
    Money oneDinar = new Money(BigDecimal.valueOf(1));
    Money halfDinar = new Money(BigDecimal.valueOf(0.5));

    assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
        @Override
        public void call() throws Throwable {
            halfDinar.subtract(oneDinar);
        }
    }).isInstanceOf(IllegalArgumentException.class);
}

Второй класс, где мы выбросим это исключение.

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= BigDecimal.valueOf(0);

    try {
        subtractedNumber = current_Money.subtract(new 
        BigDecimal(String.valueOf(SubtractMoney.current_Money)));

        if (subtractedNumber.intValue() < 0) {
            // throw new IllegalArgumentException("Error the Subtracted is in minus...");
            // throw new Throwable();
        }

        //  System.out.println("TheValue of subtractedNumber" + subtractedNumber.toString());
    }

Iпроизвел операцию вычитания внутри оператора try и проверил, будет ли это вычитаемое число (новое число) находиться в минусе (-1 или меньше), чтобы выдать исключение.

Я пробовал это

throw new Throwable(); 

, но не сработало (возможно, я не использовал его правильно).

Я попробовал это

throw new IllegalArgumentException("Error the Subtracted is in minus...");

внутри оператора if в операторе try. (не сработало, и я не знаю, правильно ли я использовал).

Когда вызывается метод во втором классе, следует выдать исключение, если деньги в минусе (-1 или меньше).

Например, я хочу купить яблоко, и оно стоит мне 2 доллара, но я дал ему 1 доллар (1-2 = -1 (что активирует исключение)), продавец откажется завершитьоплата (покупка), и он вернет мне мой доллар, и он получит яблоко.

1 Ответ

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

Ваша проблема в условии if:

if (subtractedNumber.intValue() < 0){

это условие преобразует BigDecimal в int, усекая значение в случае десятичного числа. В вашем случае -0,5 будет усечено до 0, и поэтому ваш тест не проходит.

Измените это условие на

if (subtractedNumber.doubleValue() < 0)

раскомментируйте исключение Illegal Arg Exception, и ваш тест пройдет успешно.

Редактировать: Добавлено больше подробностей

Это код, которым я закончил:

public class Money {

    BigDecimal current_Money;

    public Money(BigDecimal money) {
        this.current_Money = money;
    }

    public Money subtract(Money subtractedMoney) {

        // TODO: Validation if needed

        BigDecimal subtractedNumber = current_Money.subtract(subtractedMoney.current_Money);

        if (subtractedNumber.doubleValue() < 0) {
            throw new IllegalArgumentException("Error the Subtracted is in minus...");
        }

        return new Money(subtractedNumber);
    }
}

Тестовый класс:

import org.assertj.core.api.Assertions;
import org.assertj.core.api.ThrowableAssert;
import org.junit.Test;

import java.math.BigDecimal;

public class MoneyTest {

    @Test
    public void subtract_money_from_smaller_money_should_fail() {
        Money oneDinar = new Money(BigDecimal.valueOf(1));
        Money halfDinar = new Money(BigDecimal.valueOf(0.5));

        Assertions.assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
            @Override
            public void call() throws Throwable {
                halfDinar.subtract(oneDinar);
            }
        }).isInstanceOf(IllegalArgumentException.class);
    }
}

Лично ябудет проверять исключение следующим образом:

import org.junit.Assert;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;

public class MoneyTest {

    @Test
    public void subtract_money_from_smaller_money_should_fail() {
        Money oneDinar = new Money(BigDecimal.valueOf(1));
        Money halfDinar = new Money(BigDecimal.valueOf(0.5));

        String expectedMessage = "Error the Subtracted is in minus...";

        Throwable exception = Assertions.assertThrows(IllegalArgumentException.class, ()
                -> {
            halfDinar.subtract(oneDinar);
        });

        Assert.assertEquals(expectedMessage, exception.getMessage());
    }
}

Оба работают как положено.

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