使用JUNIT测试InsufficientFundsException

时间:2017-09-08 17:50:27

标签: java junit

我构建了一个具有3个属性的Account类:balance,owner,acctNo。 Account类有2个构造函数,一个带有3个属性,另一个不带数据。 Account类设置和获取方法以及存取方法。

public class Account {
    private int acctNo;
    private String owner;
    private int balance;

    public Account() {
        acctNo = 0;
        owner = "";
        balance = 0;
    }

    public Account(int no, String own, int bal) {
        this.acctNo = no;
        this.owner = own;
        this.balance = bal;
    }

    public int getAcctNo() {
        return acctNo;
    }

    public void setAcctNo(int no) {
        this.acctNo = no;
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String own) {
        this.owner = own;
    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int bal) {
        this.balance = bal;
    }

    public void withdraw(int amt) throws InsufficientFundsException {
        if(amt <= balance) {
            balance -= amt;
        }
        else {
            int newBalance = amt - balance;
            throw new InsufficientFundsException(newBalance);
        }

    }

    public void deposit(int amt) {
        this.balance += amt;
    }

    public static void main (String args[]) {
        Account ac = new Account(1234, "david", 15000);
        try {
            ac.withdraw(1500);
        }catch(InsufficientFundsException e)
        {
            System.out.println("Account number: " +ac.getAcctNo());
            System.out.println("owner: " +ac.getOwner());
            System.out.println("Balance is :" +ac.getBalance() );
        }
    }
}

我还构建了一个InsufficientFundsException类,它从Exception类扩展而来。将此类修改为Account类后,withdraw方法或此setBalance方法会尝试将余额设置为零以下,InsufficientFundsException将被抛出。

public class InsufficientFundsException extends Exception {

    private final int amount;

    public InsufficientFundsException(int amt) {
        this.amount = amt;
    }

    public int getAmt() {
        return amount;
    }
}

JUnit测试人员修改withdraw()测试方法,该方法将尝试提取超过当前余额的可用性,因此setBalance()测试方法也是如此。我需要修改JUnit测试以覆盖帐户,以便捕获异常,然后捕获InsufficientFundsException

public class AccountTest {

    public AccountTest() {
    }

    @BeforeClass
    public static void setUpClass() {
    }

    @AfterClass
    public static void tearDownClass() {
    }

    @Test
    public void testAcctNo() throws InsufficientFundsException {
        Account instance = new Account();
        int id = 0;
        int number = instance.getAcctNo();
        assertEquals(id, number);       
    }

    @Test
    public void testBalance() throws InsufficientFundsException {
        Account instance = new Account();
        int expResult = 0;
        int result = instance.getBalance();
        assertEquals(expResult, result);

    }

    @Test(expected=InsufficientFundsException.class)
    public void testWithdraw() throws InsufficientFundsException {
        int amount = 0;
        Account instance = new Account ();
        instance.withdraw(amount);
        int balance = instance.getBalance();
        assertEquals(-amount, balance);
    }

    @Test
    public void testDeposit() throws InsufficientFundsException {
        int amount = 0;
        Account instance = new Account ();
        instance.deposit(amount);
        int balance = instance.getBalance();
        assertEquals(amount, balance);
    }
}

当我运行测试时,我收到消息:

testWithdraw Failed: Expected exception: InsufficientFundsException

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

下面:

if(amt <= balance) {
    balance -= amt;

当AMT比当前余额更大时,您才会抛出该异常。

但是在你的测试中,你将余额设置为0,并且也是...... 0 == 0,因此不会抛出任何异常。

除此之外:您的测试用例过度:因为它是

@Test(expected=InsufficientFundsException.class)

期望抛出异常,但另一方面是最后语句

    assertEquals(-amount, balance);

你想要比较一些东西。没有任何意义。优良做法是将那些期望异常的测试用例尽可能地缩小为 short 。只需执行 minimum 即可触发该异常。

测试用例应该测试一个方面。断言和期待异常已经是两个。除此之外,可以抛出的行发生在断言之前。因此,当抛出异常时,首先不会调用断言!

答案 1 :(得分:2)

您的测试夹具不正确 因为如果account.balance==0amt==0,则这种情况属实:

 if(amt <= balance) {

所以永远不会抛出InsufficientFundsException

你的考试可以写成:

@Test(expected=InsufficientFundsException.class)
public void withdrawWithNotEnoughFund() throws InsufficientFundsException {
    int amount = 1;
    Account instance = new Account();
    instance.withdraw(amount);
    int balance = instance.getBalance();
}

请注意,withdrawWithNotEnoughFund()作为测试方法名称的testWithdraw()更有意义,调用withdraw()后的断言没有意义:assertEquals(-amount, balance);)因为你不是在被测试的方法调用之后期望返回InsufficientFundsException应该被抛出。

答案 2 :(得分:1)

您在测试中从帐户中提取0。这是正常的,并且不会抛出预期的异常,因此您的测试将失败,因为您希望抛出异常。

在您的测试中设置amount = 1;,这样您的余额就会超过您的帐户余额,并且会抛出异常,并且您的测试将会正常,因为会抛出预期的异常。