您的问题是在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());
}
}
两者都按预期工作。