我想使用Junit测试框架测试我的Java代码。在我的源代码中,我使用try and catch块来处理异常。在我的测试方法中,我想测试此方法。如果我的源代码返回某些异常,并且在我的测试方法中匹配,则我的测试将通过,否则将失败。但是我的代码没有通过此测试。
我找到了一种解决方法,但是我想使用try and catch块。我也会分享。
不工作 我的源代码(我想测试此方法)
public boolean isCreateAccount(String amount) {
try {
Double balance = Double.parseDouble(amount);
if(balance < 0)
throw new Exception();
} catch (Exception e) {
System.out.println("WARNING: Invalid amount!");
}
return false;
}
这是我在JUnit中的测试方法
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void testCreateAccountInvalidAmount() {
expectedException.expect(Exception.class);
accountServices.isCreateAccount("-100");
}
工作 这种方式有效,但我想使用try and catch块 我的源代码(我想测试此方法)
public void isCreateCheckingAccount(String amount) {
Double balance = Double.parseDouble(amount);
if(balance < 0)
throw new Exception();
}
这是我在JUnit中的测试方法
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void testCreateAccountInvalidAmount() {
expectedException.expect(Exception.class);
accountServices.isCreateAccount("-100");
}
答案 0 :(得分:0)
看看你的方法。它具有以下行为:
如果数量为负数或不是数字,它将向sysout打印一些信息(这很糟糕;您不应混合使用这种职责;您的“帐户”工具当然也不是UI层,但这是次要问题) 。否则它什么也不打印。
然后,无论您传入什么内容,它都将输出false。
因此,此方法的可观察到的行为是它返回false,并向sysout打印一些内容。
测试它返回false是微不足道的; assertFalse(services.isCreateAccount("100")
会做到这一点(尽管,实际上,您的方法总是返回false实际上是一个错误)。
测试它可以向sysout打印一些内容很复杂。这是因为存在一个基本问题,您不应在那里打印任何内容。如果输出是问题的一部分,则无需打印到System.out
,而是将一些输出抽象(也许是java.io.PrintWriter
)传递到AccountServices
,以便您可以将输出的某些变体作为一部分传递测试;可以配置为检查此处是否显示某些预期输出的变体。
您似乎对这种方法引发了一些印象。它不是-它抓住。用junit表示:“我希望这个异常”意味着您希望它不属于该方法,即相反:该方法无法捕获该异常,甚至该方法显式抛出该异常。
答案 1 :(得分:0)
这将满足您的要求:
public boolean isCreateAccount(String amount) throws Exception {
Double balance = Double.parseDouble(amount);
if (balance < 0) {
System.out.println("WARNING: Invalid amount!");
throw new Exception();
}
return false;
}
返回false没什么意义。
如果您真的想要尝试catch块:
public boolean isCreateAccount(String amount) throws Exception {
try {
Double balance = Double.parseDouble(amount);
if (balance < 0) {
System.out.println("WARNING: Invalid amount!");
throw new Exception();
}
} catch (Exception e) {
throw e;
}
return false;
}
这些基本测试适用于两个版本:
public class AccountTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void testCreateAccountInvalidAmount() throws Exception {
Account accountServices = new Account();
expectedException.expect(Exception.class);
accountServices.isCreateAccount("-100");
}
@Test
public void testCreateAccountZeroAmount() throws Exception {
Account accountServices = new Account();
assertFalse(accountServices.isCreateAccount("0"));
}
@Test
public void testCreateAccountValidAmount() throws Exception {
Account accountServices = new Account();
assertFalse(accountServices.isCreateAccount("1"));
}
}
答案 2 :(得分:0)
我发现了这个问题。谢谢您的帮助。我在这里分享我的解决方案。如果您遇到此类问题,希望对您有所帮助。
//此代码在我的服务层中...
@Override
public boolean isCreateAccount(String amount) {
try {
isValidAmount(amount);
double balance = Double.parseDouble(amount);
createAccount(balance);
return true;
} catch(NullPointerException e) {
log.warn("WARNING: Empty Amount!");
System.out.println("\nWARNING: Empty Amount!");
} catch (NumberFormatException e) {
log.warn("WARNING: Invalid amount!");
System.out.println("\nWARNING: Invalid amount!");
} catch (NegativeAmountException e) {
log.warn("WARNING: Amount must have a positive number!");
System.out.println("\nWARNING: Amount must have a positive number!");
} catch (InsufficientAmountException e) {
log.warn("WARNING: Not enough money to open a checking account!");
System.out.println("\nWARNING: Not enough money to open a checking
account!");
}
return false;
}
//此代码在我的服务层中...
@Override
public void isValidAmount(String money) {
if(money == null || money.length() == 0) {
throw new NullPointerException("Empty Amount");
}
double amount = 0.0D;
try {
amount = Double.parseDouble(money);
} catch (NumberFormatException e) {
throw new NumberFormatException("Invalid Amount");
}
if(amount < 0.0D) {
throw new NegativeAmountException("Negative Amount");
}
if(amount < 25.0D) {
throw new InsufficientAmountException("Insufficient Amount");
}
}
//此代码在我的Junit测试类中
@Test
public void testCreateCheckingAccountNullAmount() {
expectedException.expect(NullPointerException.class);
expectedException.expectMessage("Empty Amount");
accountServices.isValidAmount("");
}
@Test
public void testCreateCheckingAccountInvalidAmount() {
expectedException.expect(NumberFormatException.class);
expectedException.expectMessage("Invalid Amount");
accountServices.isValidAmount("a100");
}
@Test
public void testCreateCheckingAccountNegativeAmount() {
expectedException.expect(NegativeAmountException.class);
expectedException.expectMessage("Negative Amount");
accountServices.isValidAmount("-10");
}
@Test
public void testCreateCheckingAccountInsufficientAmount() {
expectedException.expect(InsufficientAmountException.class);
expectedException.expectMessage("Insufficient Amount");
accountServices.isValidAmount("10");
}