如何对重载函数进行单元测试?

9

我有一个类,大致如下:

public class MyClass
{

    DatabaseDependency _depend;

    public MyClass(DatabaseDependency depend)
    {
        _depend = depend;
    }

    public string DoSomething(DBParameter database)
    {
        var result = _depend.GetResults(database, ...);
        string response = String.Empty;        

        // some logic to process the result 

        return response;
    }

}

其中DBParameter是一个简单的值类,包含属性如Server、DBName、DBType等。

现在,我想要给DoSomething添加一个重载,以便它可以接受连接字符串而不是DBParameter参数(假设DatabaseDependency已经有了一个GetResults重载,它可以接受连接字符串)。

我的问题是:我有几个单元测试,描述了用于处理来自DatabaseDependency.GetResults结果的各种逻辑路径。当我添加重载到DoSomething时,我会重构代码,使得这个逻辑被两个重载都重用(即可能将其移动到一个私有方法中)。应该如何进行单元测试?我需要为我正在添加的新重载验证所有逻辑路径吗?

4个回答

7
如果您的代码保持当前的样子,那么是的:您需要对该方法进行单元测试,从而实现测试工作的重复。
但是,如果实现功能使得一个方法仅仅调用另一个方法,则可以将另一个方法设置为虚拟方法。这将允许您创建一个特定于测试的子类,在其中验证其他方法是否以正确的值调用了虚拟方法。
一旦通过一个或多个单元测试验证了这一点,您就不需要进一步测试该方法,因为现在您已经证明该方法正确地调用了另一个方法,并且可以将测试重点集中在该方法上。

6
如果您确信重载的方法只是将字符串转换为连接对象并委托给原始方法,那么您应该添加一个测试方法。
但是,如果您重构底层的重载方法以使其不进行委派,则此方法会中断。在这种情况下,我更有信心复制两种方法的所有测试。
我认为第一种方法是最实用的。然而,定期运行代码覆盖率分析是个好主意,这将在以后指示是否需要更多测试。

1

是的,将常见处理重构为私有方法 - 我假设无论如何您都会这样做,不考虑测试方面,重复代码是不好的。有趣的是,考虑测试如何引导我们做正确的事情。

然后,您可以为每个重载的初始化路径编写几个简单的测试。


0

这取决于您是进行黑盒测试还是白盒测试,以及您的应用程序是否同时使用两个版本的方法。

如果您假设您只是在测试实现,则仅测试“主”版本即可。如果您考虑的是只知道所呈现API(javadocs或类似内容)的测试编写者,则需要仅基于API进行测试,这意味着完全测试两种方法。

如果您的应用程序仅使用一种方法,则弃用另一种方法并创建一个版本条件测试,当弃用的方法仍存在于某个预定版本时失败。例如:强制要求在某个时间点删除弃用的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接