围绕异常单元测试区域的正确方法是什么

Cod*_*dek 6 unit-testing exception

看看我们的单元测试的代码覆盖率,我们非常高.但最后几个%是棘手的,因为他们中的很多人正在捕捉像数据库异常这样的东西 - 在正常情况下这些都不会发生.例如,代码可以防止字段太长等,因此唯一可能的数据库异常是,如果数据库被破坏/关闭,或者模式在我们的脚下被更改.

那么模仿对象以便抛出异常的唯一方法是什么?这似乎有点无意义.也许最好不接受100%的代码覆盖率?

谢谢,丹

pon*_*zao 1

通常,当遇到低级异常(例如 Java 中的 IOException 或 SQLException)时,我会将它们包装到扩展 RuntimeException 的异常中。我觉得测试这种行为非常重要,因为否则很可能会意外吞掉异常。

因此,如果您在引发低级异常时确实执行了某些操作,我建议您测试它们。

编辑:添加示例。

public void store(User user) {
    try {
        userDao.store(user);
    } catch (IOException e) {
        // Logging, perhaps some logic.
        throw new ServiceException(e);
    }
}

@Test(expected = ServiceException.class)
public void Store_Fail() {
    UserDao userDaoMock = createMock(UserDao.class);
    User user = // Create test user.
    userDaoMock.store(user);
    replay(userDaoMock);
    userService.store(user);
    verify(userDaoMock);
}
Run Code Online (Sandbox Code Playgroud)

这里没有太多需要测试的地方,但是如果逻辑需要抛出 ServiceException 为什么不测试它呢?