关闭

Protected方法与单元测试

发表于:2009-10-13 15:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:老赵    来源:网络转载

  对protected方法进行Mock

  现在有一个类,其中有一个protected方法:

1. public class MockSomeClass : SomeClass 
2. { 
3.     protected override int SomeMethod(string arg) 
4.     { 
5.         return this.PublicSomeMethod(arg); 
6.     } 
7. 
8.     public virtual int PublicSomeMethod(string arg) 
9.     { 
10.         return base.SomeMethod(arg); 
11.     } 
12. } 

  在MockSomeClass中,我们覆盖了基类的SomeMethod实现,使它调用了子类中公开的PublicSomeMethod方法,而 PublicSomeMethod内部又调用了基类的SomeMethod方法。因此,如果您不去进行任何处理,那么MockSomeClass会保持 SomeMethod的实现不变。而如果您需要对SomeMethod进行Mock或Stub的时候,便可以从PublicSomeMethod下手:

1. Mock<MockSomeClass> mockSomeClass = new Mock<MockSomeClass>() { CallBase = true };
2. mockSomeClass.Setup(c => c.PublicSomeMethod("123")).Returns(123);
3.
4. DoSomeTest(mockSomeClass.Object); // use the mock object

  也很容易。

  为了可测试性

  值得注意的是,为了“可测试性”,第二部分中的protected方法必须是virtual的,因为我们需要在子类中进行override。同理,Mock框架能够辅助的方法也必须是virtual的,即使是一个public方法。那么,您觉得这是为了可测试性而做出的让步吗?或者换句话说,您觉得,一个不可以override的protected方法,但是会影响到其他公开接口的功能,这是不是一个合理的设计呢?如果这是一个合理的设计,又不想作出这样的让步……我们又该怎么做呢?(以上言论仅代表作者的个人观点,不代表51Testing观点)

22/2<12
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • VisualUnit
    2009-10-13 18:14:34

    这样好象太麻烦,并且对private方法无效。也许有人会说单元测试不测试private方法,这是很奇怪的,凡是稍复杂的,不能通过阅读代码确定是否有错的函数都应测试,跟是否接口无关。
    类似的问题还有虚基类不能实例化。不要告诉我虚基类不用测试,当虚基类中有实方法时也要测试的。
    C/C++可以用宏将protected和private关键字替换为pubic,但无法解决虚基类的问题。
    一个简单的方案是:用工具自动拷贝源代码,并做一些修改,解决以上难于测试的问题,然后测试拷贝的文件。更进一步的做法是让工具监视产品代码,自动更新拷贝。这种简单功能的工具,开发起来应该很容易的。不过,还有很多可测性问题,举个简单的例子,如下代码:
    //功能: 游戏程序中用于计算打击效果的代码片断,连续打击时
    //效果随次数递减
    //参数: reset, 输入参数,为true时重置打击次数
    //返回: int类型,打击效果
    int PowerEffect(bool reset)
    {
        //打击次数,由于是局部变量,用例中无法访问,难于测试
        static int times = 0
        if(reset) times = 0;
            times++;

        int effect[] = {9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
        if(times >= sizeof(effect) / sizeof(effect[0]))
            return 0;
        return effect[times];
    }
    局部静态变量如何在用例中设置?类似的问题还有很多很多。
    实际做起来到处是问题,这大概就是单元测试难于实施的原因吧。

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号