我有这个简单的方法:
public int divide(int a, int b) throws ArithmeticException {
if (b == 0) {
throw new ArithmeticException("Division by 0");
} else {
return a / b;
}
}
我想进行JUnit测试。
我已完成以下操作:
@Test(expected = ArithmeticException.class) // Expected this exc
public void testDivideWhenDivisorIsZero() {
int result = c.divide(1, 0);
}
“返回”绿色条形线(“测试成功完成”)。
try-catch
子句?编辑
此JUnit测试是否等效于以下内容?
@Test
public void testDivideWhenDivisorIsZero() {
try{
c.divide(1, 0);
fail("Expected ArithmeticException");
} catch(ArithmeticException e) {
}
}
答案 0 :(得分:1)
您的测试看起来正确,因此您不应在单元测试中使用try..catch
块。有很多方法,其中之一就是您的方法。但是对于您的方法,我想使用:
try {
return a / b;
} catch (ArithmeticException e) {
throw new ArithmeticException("Division by 0");
}
让异常被引发并捕获。比在执行任何操作之前检查值(这种情况很少发生)更干净
答案 1 :(得分:0)
您这样做的方式对我来说似乎很好。
在这种情况下,它应该适合您的需求。尽管如此,我个人更喜欢使用try-catch-block来实现。正如您所建议的那样,它们相当。我认为,如果您使用try-catch-block,那么您将拥有一些优势。
首先,您可以断言,如果抛出的异常的错误消息实际上与您所排除的一样,此外,您还可以确定,异常实际上发生在被测方法期间而不是初始化期间-逻辑。 为了使这一点更加清晰:
public int divide(int a, int b) throws ArithmeticException {
if (b == 0) {
throw new ArithmeticException("Division by 0");
} else if(a<b){
//I know, that this condition is pretty senseless. It's for demonstration only.
throw new ArithmeticException("a is smaller than b");
} else{
return a / b;
}
}
然后您可以像这样测试您的方法,并且可以确定抛出了正确的异常:
@Test
public void testDivideWhenDivisorIsZero() {
try{
c.divide(1, 2);
fail("Expected ArithmeticException");
} catch(Exception e) {
if(e instanceof ArithmeticException){
Assert.assertTrue(e.getMessage().equals("a is smaller than b"));
}else{
fail("The wrong Exception was thrown" + e.toString())
}
}
}
但是正如我所说,您的尝试完全符合需求。
答案 2 :(得分:0)
生产代码: 既不需要捕获也不必声明异常,因此我建议避免两者。
public static int divide(int a, int b) {
return a / b;
}
如果您想与您的API用户交流可以抛出ArithmeticException的异常,那么您应该在javadoc中进行此操作。
测试代码: JUnit5使asserting exceptions更加容易。
@Test
void divide_whenDenominatorIsZero_shouldThrow() {
assertThrows(ArithmeticException.class, () -> divide(1, 0));
}