java 负数异常_java - 如何为抛出异常的负数编写完美的代码?使用assertThatThrownBy - 堆栈内存溢出...

您的问题是在if条件下:

if (subtractedNumber.intValue() < 0){

此条件会将BigDecimal转换为int,如果是小数则截断该值。 在您的情况下,-0.5将被截断为0,这就是为什么测试未通过的原因。

将此条件更改为

if (subtractedNumber.doubleValue() < 0)

取消注释非法Arg异常,您的测试将通过。

编辑:增加了更多细节

这是我结尾的代码:

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

}

}

两者都按预期工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值