繁体   English   中英

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

[英]Correct way to JUnit test divide() method

我有这个简单的方法:

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) {

        }
    }

你的测试看起来是正确的,你不应该在单元测试中使用try..catch块。 有很多方法,其中一种是你的。 但是对于您的方法,我想使用:

try {
    return a / b;
} catch (ArithmeticException e) {
    throw new ArithmeticException("Division by 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())
            }
        } 
    }

但正如我所说,您的尝试完全符合需求。

生产代码:既不需要捕获也不需要声明异常,我建议避免两者。

public static int divide(int a, int b) {
    return a / b;
}

如果您想与您的 API 用户沟通可以引发 ArithmeticException,那么您应该在 javadoc 中进行。

测试代码: JUnit5使断言异常变得更加容易。

@Test
void divide_whenDenominatorIsZero_shouldThrow() {
    assertThrows(ArithmeticException.class, () -> divide(1, 0));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM