- 投币足够
- 零食堆非空
- 找零
- 售货机余额足够找零
- 退币
我们还有需求未满足,如需要检查投币是否足够购买零食,退币不足时应禁止购买。还应确保剩余零食非空、投币超额时找零和余额不足时禁止购买。我们先实现前两个需求:
@Test
public void cannot_make_purchase_if_not_enough_money_inserted() {
SnackMachine snackMachine = new SnackMachine();
snackMachine.loadSnacks(1, new SnackPile(new Snack("Some snack"), 1, 2));
snackMachine.insertMoney(Dollar);
assertThrows(IllegalStateException.class, () -> {
snackMachine.buySnack(1);
});
}
测试通过,因为之前已经对这部分做了检查。接下来验证投币不足时禁止购买:
SnackMachine snackMachine = new SnackMachine();
snackMachine.loadSnacks(1, new SnackPile(new Snack("Some snack"), 1, 2));
snackMachine.insertMoney(Dollar);
assertThrows(IllegalStateException.class, () -> {
snackMachine.buySnack(1);
});
测试是失败的,因为我们还没有实现功能,接下来实现:
public void buySnack(int position) {
Slot slot = getSlot(position);
if (slot.getSnackPile().getPrice() > moneyInTransaction.getAmount()) {
throw new IllegalStateException();
}
slot.setSnackPile(slot.getSnackPile().subtractOne());
moneyInside = Money.add(moneyInside, moneyInTransaction);
moneyInTransaction = None;
}