- 投币足够
- 零食堆非空
- 找零
- 售货机余额足够找零
- 退币
我们还有需求未满足,如需要检查投币是否足够购买零食,退币不足时应禁止购买。还应确保剩余零食非空、投币超额时找零和余额不足时禁止购买。我们先实现前两个需求:
@Testpublic 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;}

