zoukankan      html  css  js  c++  java
  • Fakes里的stub和shim的区别

    stub常用于虚拟接口、类、方法,无法重写静态方法(stub需要传递到具体调用代码中)

    shim常用于重写静态方法(在ShimsContext.Create()作用域内,拦截Runtime动态修改方法的实现,静态方法无需传递)

    shim如果用于重写非静态方法,依然需要传递

    以下两种的目的都是虚拟TokenHandler.GetToken这个方法

    stub:

                var stubTokenHandler = new StubTokenHandler<Token>("user")
                {
                    GetToken = () => { return new Token() { UserId = 1 }; }
                };

    shim:(可以和stub一样直接修改GetToken方法,但就无法达到全局调用的目的;下面的例子里是通过Factory静态方法调用,虚拟整个类的实现以达到全局可调用的目的)

                using (ShimsContext.Create())
                {
                    ShimTokenFactory.TokenHandler = () =>
                    {
                        return new TokenHandlerDefine(1);
                    };
                }
        public class TokenHandlerDefine : TokenHandler<Token>
        {
            private int userId;
            public TokenHandlerDefine(int userId)
            {
                this.userId = userId;
            }
    
            public override Token GetToken()
            {
                return new Token() { UserId = userId };
            }
        }
        public class TokenFactory
        {
            public static TokenHandler<Token> TokenHandler()
            {
                return new TokenHandler<Token>("user");
            }
        }
  • 相关阅读:
    Android之Parcel
    Android常用的IPC通信
    Android之Surface绘制原理
    Android之Surface
    Android之SurfaceFlinger服务
    Android Service(服务)
    Android Service进阶之路
    Android之UI线程启动
    Android之Activity显示原理
    python17-Django进阶
  • 原文地址:https://www.cnblogs.com/yeagen/p/11718813.html
Copyright © 2011-2022 走看看