我构建了一个有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
我该怎么解决这个问题?
你在测试中从你的账户中提取0
。这是正常的,不会引发预期的异常,因此测试会失败,因为您预期会引发异常。
设置金额=1
在你的测试中,这样你提取的钱比你的帐户余额多,异常就会被抛出,你的测试也会正常,因为预期的异常会被抛出。
您的测试夹具不正确。
因为如果account.balance==0
和amt==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
。
这里:
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例外