zoukankan      html  css  js  c++  java
  • 利用反射编写私有 Private 方法的单元测试

    利用反射编写私有 Private 方法的单元测试

    最近在添加一个新feature时,鉴于要给自己的代码一是增加代码的强壮性,二是增加代码测试的覆盖率。但是遇到了有些方法是 Private 的,但是在调用这个私有方法的方法里面已经写过测试了。代码就像下面这样:

    namespace Test
    {
        class HttpTest
        {
            public HttpResponse GetHttpResponse(HttpRequest request)
            {
                ...
                GetPrivateValue(request);
                ...
            }
    
            private string GetPrivateValue(HttpRequest request)
            {
                return System.Text.Encoding.Default.GetString(request.Content);
            }
        }
    }
    

    那么要如何进行这个私有方法的单元测试呢?正好又去阅读了 CLR via C# ,就想到了反射。

    那么如何写测试代码呢?

    代码示例如下:

    Type type = typeof(HttpTest);
    var resolveMethod = Activator.CreateInstance(type);//有多个重载,若构造方法不含无参的构造函数,则需要显式传入参数进行初始化
    
    HttpRequest request = new HttpRequest();
    obj[] parameter = {request};
    
    MethodInfo methodInfo = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)
                    .Where(x => x.Name == "GetPrivateValue" && x.IsPrivate)
                    .First();
    
    methodInfo.Invoke(resolveMethod,parameter);
    

    首先那个你所需要整个类的 Type 类型,根据这个类 你几乎可以拿到和构造出你所想要的任何东西。

    然后就是创建一个 instance 实例,关于你所需要的类的。

    接下来就是找到你这个类中的私有方法,然后进行调用,就完成了这个私有方法的测试了。

    如果你所要测试的私有方法是个 Generic 泛型的,你需要在 MethodInfo 下面再加一步

    MethodInfo genericMethod = methodInfo.MakeGenericMethod(typeof(<T>))

  • 相关阅读:
    洛谷P1880 [NOI1995]石子合并 (区间dp
    洛谷P1012 拼数(水题 字符串
    洛谷P1071 潜伏者(水题
    微信《跳一跳》超高分攻略,轻松排行榜首
    StringUtilsd的isEmpty、isNotEmpty、isBlank、isNotBlank
    java.util.Properties类
    timer.scheduleAtFixedRate和timer.schedule的实验
    schedule() 和 scheduleAtFixedRate() 区别
    session和jsessionid有什么关系
    增加Xss过滤步骤
  • 原文地址:https://www.cnblogs.com/xiyin/p/10582750.html
Copyright © 2011-2022 走看看