JUnit测试divide()方法的正确方法

时间:2019-11-19 10:28:34

标签: java junit

我有这个简单的方法:

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);
    }

“返回”绿色条形线(“测试成功完成”)。

  • 这是JUnit测试此方法的正确方法还是应该在该测试中放置try-catch子句?

编辑

此JUnit测试是否等效于以下内容?

@Test
    public void testDivideWhenDivisorIsZero() {
        try{
            c.divide(1, 0);
            fail("Expected ArithmeticException");
        } catch(ArithmeticException e) {

        }
    }

3 个答案:

答案 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));
}