• 投币足够
    • 零食堆非空
    • 找零
    • 售货机余额足够找零
    • 退币

    我们还有需求未满足,如需要检查投币是否足够购买零食,退币不足时应禁止购买。还应确保剩余零食非空、投币超额时找零和余额不足时禁止购买。我们先实现前两个需求:

    1. @Test
    2. public void cannot_make_purchase_if_not_enough_money_inserted() {
    3. SnackMachine snackMachine = new SnackMachine();
    4. snackMachine.loadSnacks(1, new SnackPile(new Snack("Some snack"), 1, 2));
    5. snackMachine.insertMoney(Dollar);
    6. assertThrows(IllegalStateException.class, () -> {
    7. snackMachine.buySnack(1);
    8. });
    9. }

    image.png
    测试通过,因为之前已经对这部分做了检查。接下来验证投币不足时禁止购买:

    1. SnackMachine snackMachine = new SnackMachine();
    2. snackMachine.loadSnacks(1, new SnackPile(new Snack("Some snack"), 1, 2));
    3. snackMachine.insertMoney(Dollar);
    4. assertThrows(IllegalStateException.class, () -> {
    5. snackMachine.buySnack(1);
    6. });

    image.png
    测试是失败的,因为我们还没有实现功能,接下来实现:

    1. public void buySnack(int position) {
    2. Slot slot = getSlot(position);
    3. if (slot.getSnackPile().getPrice() > moneyInTransaction.getAmount()) {
    4. throw new IllegalStateException();
    5. }
    6. slot.setSnackPile(slot.getSnackPile().subtractOne());
    7. moneyInside = Money.add(moneyInside, moneyInTransaction);
    8. moneyInTransaction = None;
    9. }

    image.png