【问题标题】:how to test this class with JUnit?如何用 JUnit 测试这个类?
【发布时间】:2016-09-11 20:00:57
【问题描述】:

我必须为这个自动售货班做单元测试。我开始思考如何做到这一点,但我意识到自动售货类没有返回类型的方法(顺便说一句,我只知道如何测试返回类型的方法),而且我一直使用断言。

import java.util.Hashtable;

class VendingItem {
    double price;
    int numPieces;

    VendingItem(double price, int numPieces) {
        this.price = price;
        this.numPieces = numPieces;
    }

    void restock(int pieces) {
        this.numPieces = this.numPieces + pieces;
    }

    void purchase(int pieces) {
        this.numPieces = this.numPieces - pieces;
    }
}

/**
 * Class for a Vending Machine. Contains a hashtable mapping item names to item
 * data, as well as the current balance of money that has been deposited into
 * the machine.
 */
public class Vending {
    private static Hashtable<String, VendingItem> Stock = new Hashtable<String, VendingItem>();
    private double balance;

    Vending(int numCandy, int numGum) {
        Stock.put("Candy", new VendingItem(1.25, numCandy));
        Stock.put("Gum", new VendingItem(.5, numGum));
        this.balance = 0;
    }

    /** resets the Balance to 0 */
    void resetBalance() {
        this.balance = 0;
    }

    /** returns the current balance */
    double getBalance() {
        return this.balance;
    }

    /**
     * adds money to the machine's balance
     * 
     * @param amt
     *            how much money to add
     */
    void addMoney(double amt) {
        this.balance = this.balance + amt;
    }

    /**
     * attempt to purchase named item. Message returned if the balance isn't
     * sufficient to cover the item cost.
     * 
     * @param name
     *            The name of the item to purchase ("Candy" or "Gum")
     */
    void select(String name) {
        if (Stock.containsKey(name)) {
            VendingItem item = Stock.get(name);
            if (balance >= item.price) {
                item.purchase(1);
                this.balance = this.balance - item.price;
            } else
                System.out.println("Gimme more money");
        } else
            System.out.println("Sorry, don't know that item");
    }

}

例如,您认为我可以如何测试打印某些东西的方法?

【问题讨论】:

  • 您可以尝试为变量添加 Getter,并在 JUnits 中创建每个方法,然后打印每个变量的 getter?
  • 如果 void 方法有副作用(例如更改余额或 numPieces),您仍然可以测试它们。您可以在使用 getter 调用方法后检查它们是否发生了变化(请参阅@AlejandroCortes 评论)。对于 System.out.print 测试,请参阅stackoverflow.com/questions/1119385/…

标签: java eclipse unit-testing testing junit


【解决方案1】:

这个呢:

@Test
public void testResetVendingBalance()  {
    Vending vending = new Vending(0,0);
    vending.addMoney(7);
    vending.resetBalance();
    assertEquals("Test if vending reset.",0, vending.getBalance(), 0);
}

@Test
public void testAddVendingBalance()  {
    Vending vending = new Vending(0,0);
    vending.addMoney(7);
    assertEquals("Test money amount.",7, vending.getBalance(), 0);
}

【讨论】:

    【解决方案2】:

    在大多数情况下,您应该测试逻辑。例如,您重置余额并检查它是否等于 0 或获取余额并保持其值,然后使用 addMoney 方法检查余额是否具有预期值。而所有这些都可以通过assert 方法来完成。我希望这些解释有所帮助。

    【讨论】:

      【解决方案3】:

      将 System.out 重新分配给您可以测试的东西? 来自 System 的 javadoc:

      static void setOut(PrintStream out)
      重新分配“标准”输出流。

      然后你就可以验证它的价值了。

      【讨论】:

        【解决方案4】:

        您应该问自己的问题是“我到底要测试什么?”在您的情况下,答案可能类似于“重新进货机器会增加数量,而购买会减少数量”。也许价格不变的测试也值得进行。

        现在你已经有了,问题是你需要什么来测试这个?您的股票和价格的吸气剂在这里可能很好。

        【讨论】:

          猜你喜欢
          • 2020-02-10
          • 2011-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多