我构建了一个具有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
我该如何解决这个问题?
答案 0 :(得分:4)
下面:
if(amt <= balance) {
balance -= amt;
当AMT比当前余额更大时,您才会抛出该异常。
但是在你的测试中,你将余额设置为0,并且也是...... 0 == 0,因此不会抛出任何异常。
除此之外:您的测试用例过度:因为它是
@Test(expected=InsufficientFundsException.class)
期望抛出异常,但另一方面是最后语句
assertEquals(-amount, balance);
你想要比较一些东西。没有任何意义。优良做法是将那些期望异常的测试用例尽可能地缩小为 short 。只需执行 minimum 即可触发该异常。
测试用例应该测试一个方面。断言和期待异常已经是两个。除此之外,可以抛出的行发生在断言之前。因此,当抛出异常时,首先不会调用断言!
答案 1 :(得分:2)
您的测试夹具不正确
因为如果account.balance==0
和amt==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;
,这样您的余额就会超过您的帐户余额,并且会抛出异常,并且您的测试将会正常,因为会抛出预期的异常。