Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用JUnit测试这个类?_Java_Eclipse_Unit Testing_Testing_Junit - Fatal编程技术网

Java 如何用JUnit测试这个类?

Java 如何用JUnit测试这个类?,java,eclipse,unit-testing,testing,junit,Java,Eclipse,Unit Testing,Testing,Junit,我必须为这个自动售货机类做单元测试。我开始思考如何做,但我意识到vending类没有返回类型的方法。顺便说一句,我只知道如何测试返回类型的方法,而且我一直使用assert import java.util.Hashtable; class VendingItem { double price; int numPieces; VendingItem(double price, int numPieces) { this.price = price;

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

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");
    }

}

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

将System.out重新分配给您可以测试的内容? 从系统的javadoc:

静态void setOutPrintStream out 重新分配标准输出流


然后您可以验证它的值。

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


既然你已经知道了,问题是你需要什么来测试这个?获取股票和价格的信息在这里可能很好。

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

这个呢:

@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);
}

您可以尝试为变量添加getter,然后在JUnits中生成每个方法,然后打印每个变量的getter?如果void方法有诸如更改平衡或numPieces之类的副作用,您仍然可以测试它们。您可以使用getter检查它们在方法调用后是否发生了更改,请参见@AlejandroCortes注释。有关System.out.print测试,请参阅。