unit-testing - TDD 如何处理异常和参数验证?

标签 unit-testing debugging exception tdd

我来到了一个十字路口。我最近写了一个没有 TDD 的 10,000 行应用程序(我知道这是一个错误)。我确实遇到了很多错误,但现在我想改造这个项目。这是我遇到的问题。让我们举一个执行除法的函数的例子:

public int divide (int var1, int var2){
if (var1 == 0 || var2 == 0)
   throw new RuntimeException("One of the parameters is zero");
return var1 / var2;
}

在这种情况下,我会抛出一个运行时错误,这样我就可以失败并至少发现我的代码在某处损坏了。问题是2折。首先,我是否正确使用了这里的异常?其次,我该如何编写一个测试来处理这个异常?显然我希望它通过测试,但在这种情况下它会抛出异常。 不太确定如何解决这个问题。 TDD 通常会采用不同的方式来处理这种情况吗?

谢谢

最佳答案

首先,您的第一个参数(分子)为零可能不会导致抛出异常。答案应该只是零。仅当用户尝试除以零时才抛出异常。

其次,有两种方法(使用 JUnit)来测试异常是否在应该抛出的时候抛出。第一种“经典”方法:

@Test
public void testForExpectedExceptionWithTryCatch()
        throws Exception {
    try {
        divide (1, 0);
        fail("division by zero should throw an exception!");
    } catch (RuntimeException expected) {
        // this is exactly what you expect so 
        // just ignore it and let the test pass
    }
}

JUnit 4 中较新的方法使用注释来减少您需要编写的代码量:

@Test(expected = RuntimeException.class)
public void testForExpectedExceptionWithAnnotation()
        throws Exception {
    divide (1, 0);
}

这里,因为我们添加了(expected = RuntimeException.class)对于注释,如果调用 divide 测试将失败不会抛出 RuntimeException .

关于unit-testing - TDD 如何处理异常和参数验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1776007/

相关文章:

objective-c - XCode 4.2中应用测试和逻辑测试代码模板的区别

javascript - 通过代码打开 Chrome Inspector 来捕获快速断点?

.net - 在 C++ .net4 中使用和不使用调试器的不同代码行为

android - 从数组列表中删除元素后的java.util.ConcurrentModificationException android

java - 为什么我的 JSONObject 相关单元测试失败?

PHPUnit 断言没有调用任何方法

android - Flutter : RangeError (index) when building a Row inside a listView

java - 获取 Math.abs 的十进制数输入/输出

python - 'sys.excepthook' 和线程

reactjs - 调用 Jest 模拟函数。但模拟的状态没有更新?