当前位置: 首页 > 知识库问答 >
问题:

JUNIT测试的异常

山翼
2023-03-14

我构建了一个有3个属性的帐户类:余额、所有者、acctNo。帐户类有2个构造函数,一个接受3个属性,一个不接受数据。帐户类有设置和获取方法以及存款和取款方法。

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类后,取款方法或此setBalance方法尝试将余额设置为零以下,将抛出InsufficientFundsException

public class InsufficientFundsException extends Exception {

    private final int amount;

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

    public int getAmt() {
        return amount;
    }
}

JUnit测试人员修改提取()测试方法,将尝试提取超过当前余额的可用,所以做setBalance()测试方法。我需要修改JUnit测试透支帐户,以便它捕获异常,并捕获不足资金异常

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个答案

阮才俊
2023-03-14

你在测试中从你的账户中提取0。这是正常的,不会引发预期的异常,因此测试会失败,因为您预期会引发异常。

设置金额=1 在你的测试中,这样你提取的钱比你的帐户余额多,异常就会被抛出,你的测试也会正常,因为预期的异常会被抛出。

薄哲
2023-03-14

您的测试夹具不正确。
因为如果account.balance==0amt==0,则此条件为true:

 if(amt <= balance) {

所以不会被抛出。

你的测试可以写成:

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

请注意,作为测试方法的名称,提现NotEnoughFund()更有意义,并且调用提现()后的断言没有意义:assertEquals(-金额,余额);),因为您不期望在测试方法调用后返回,因为应该抛出InpleentFundsExctive

燕玉堂
2023-03-14

这里:

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

只有当金额大于当前余额时,才会抛出该异常。

但是在您的测试中,您将余额设置为0,以及amt...0==0,因此不会引发异常。

除此之外,你的测试用例做得太过分了

@Test(expected=InsufficientFundsException.class)

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

    assertEquals(-amount, balance);

你想比较一下。没有任何意义。在您期望异常尽可能短的情况下,减少这些测试用例是一种很好的做法。只要做最起码的事情来触发异常。

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

 类似资料:
  • 问题内容: 我真的是java的新手。 我正在构造函数上运行一些JUnit测试。构造函数是这样的:如果为其参数之一赋予null或空字符串,则应该抛出异常。 当我在JUnit中使用null或空字符串参数测试此构造函数时,即使我几乎100%确信将此类参数传递给它时,构造函数方法确实会引发异常,我也会看到一条红色的条。 如果该方法以预期的方式引发异常,则JUnit中是否应该没有绿色的条形?还是当异常抛出按

  • 问题内容: 编辑:目前没有JUnit 4。 嗨,您好, 我对使用JUnit进行“智能”异常测试有疑问。目前,我这样做是这样的: 如您所见,对于每个应该引发异常的函数,我都需要一个try / catch块。似乎不是执行此操作的好方法-还是没有可能减少try / catch的使用? 问题答案: 我建议您需要分解为多个单独的测试。各个try / catch块似乎彼此非常独立。您可能还希望将通用初始化逻辑

  • 我应该如何测试异常?我可以mock connector并且我可以赋予它抛出异常的行为,但是我不明白下一步该怎么做。

  • 问题内容: 我有一个尝试获取某些文件的简单方法。我想测试文件何时不存在,这就是我的问题所在。测试不断失败。 该方法类似于: 在测试中,我尝试了两种单独的解决方案,但均未成功。 使用SO解决方案中建议的新样式 public ExpectedException exception = ExpectedException.none(); @Test public void testPopulateCon

  • 我试图创建一个测试来验证我的代码(见下面的伪代码)是否正确捕获异常。我知道JUnit能够测试代码是否用以下代码抛出异常: 然而,我正在测试的软件的原始代码捕获了这个异常并打印了一条消息 JUnit是否有办法验证此消息?或者我应该改变一下我的流行语? 注:我已阅读,我应使用以下内容: 但是程序崩溃,因为它无法识别对象。 我尝试测试的方法的伪代码(出于隐私原因,不要发布确切的内容):

  • 我的junit代码是 所以,在这里我得到了错误,就像java.lang.nullpointer例外