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"); } }