Protected方法与单元测试

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

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

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

  本篇文章讨论了protected方法的测试和Mock,以及其中需要注意的一些可测试性的方面。这是一篇简单的文章,讨论了单元测试中遇到protected成员的应对方案。此外,在文章最后也希望和大家讨论一下某个特殊的情况下的处理方法。

  protected是一个有趣而有用的修饰符,它把方法的访问成员严格限制在自身或自己的子类身上。换句话说,在使用过程中,protected成员对外部是开放的(因为其他类可以通过继承来使用该成员),又是封闭的(不是自身或子类的一切成员都无法访问)。而对于单元测试来说,protected 成员又是尴尬的,因为它的“开放”意味着我们必须对它进行单元测试,而“封闭”又阻碍了我们在单元测试中涉及protected成员。

  测试protected方法

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

1. public class SomeClass 
2. { 
3.     protected int SomeMethod(string arg) { ... } 
4. }

  如果我们需要对这个protected方法进行单元测试,可以在测试代码中准备一个辅助类型:

1. public class SomeClassForTest : SomeClass 
2. { 
3.     public int PublicSomeMethod(string arg) 
4.     { 
5.         return this.SomeMethod(arg); 
6.     } 
7. }

  于是在单元测试中,便可以通过调用PublicSomeMethod来测试基类的SomeMethod方法:

1. var testClass = new SomeClassForTest(); 
2. var result = testClass.PublicSomeMethod(null); 
3. Assert.Equal(0, result);

  非常简单。

  如果您觉得麻烦,也可以将SomeClass类中的SomeMethod方法改为protected internal,这样便可以在InternalVisibleTo的测试程序集中使用了。不过,我觉得为单元测试而改变成员的访问级别不是一个合适的做法。

21/212>
《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号