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");
            }
        }
  • 相关阅读:
    C++ Low level performance optimize
    简单find命令的实现
    数据结构学习之栈
    随机数的生成
    数据结构学习(一)
    C复习---动态内存分配
    (转)虚拟文件系统(VFS)浅析
    (转) 中断处理程序&中断服务例程
    Gradle系列教程之依赖管理
    Gradle系列教程之依赖管理
  • 原文地址:https://www.cnblogs.com/yeagen/p/11718813.html
Copyright © 2011-2022 走看看