bas*_*bas 8 c# implementation mocking
大多数模拟框架只能模拟接口,有些可以模拟类的虚方法.一些Java模拟框架甚至能够模拟静态类.
例如Rhino mock:
var mock = MockRepository.GenerateMock<..>();
Run Code Online (Sandbox Code Playgroud)
生成模拟方法中的"魔法"是什么?有没有理由为什么C#模拟框架不允许模拟静态类?或者这只是一个"设计选择"?
查看此类框架的源代码并自己找到答案实际上是非常有趣和引人入胜的。Rhino Mocks是开源的,还有Moq和许多其他的。我肯定会建议潜入其中之一。
至于内部实现(从这里):
但是,该框架无法模拟非虚拟方法,因此我们需要将 TouchIron 方法设为虚拟方法。原因在于:Rhino Mocks 使用Castle Dynamic Proxy来处理它需要模拟的类型的代理,而 Dynamic Proxy 无法拦截对非虚拟、非抽象方法的调用。