.Net中的模拟框架如何创建模拟对象?

12
在Microsoft .Net Framework环境中,我非常好奇模拟框架(Rhino Mocks、Moq、NMock等)如何根据给定类型创建模拟对象。
我对某种方法的具体机制很感兴趣,或者如果它们使用不同的方法,也许可以概述不同的方式。另外,如果有人能指向一些文章,那就太好了。

这是一个好问题。你可以将汇编代码放入Reflector中,查看代码以开始工作。 - fletcher
3
您可能希望了解一下Castle DynamicProxy - http://www.castleproject.org/dynamicproxy/index.html。很多.NET模拟框架在幕后使用它。 - Russ Cam
正如flecther所提到的,redgate Reflector是一个非常好的程序,可以帮助我们了解编译后程序集内部的情况。只需要将DLL文件拖放到Reflector中,就可以轻松地检查代码。 - Ben McCormack
我注意到,在使用DynamicProxy时,文档非常简短。我在这里找到了一系列优秀的教程: http://kozmic.pl/archive/2009/04/27/castle-dynamic-proxy-tutorial.aspx - Matt
1个回答

16

有不同的技术可以进行mocking。

一些mocking库例如MoqRhinoMocks使用Castle Dynamic proxies。它们实质上使用反射和运行时代码生成(CodeDom)来动态生成类,这些类要么实现了被mock的接口,要么派生自正在被mock的非密封类。

TypeMock则有所不同-它使用Profiler APIs来拦截并重定向调用任何类型的任何方法。这使它能够mock密封类型、系统类,甚至拦截和转移具体类型的非虚方法的调用。

更新:来自TypeMock网站:

Typemock Isolator使用面向切面编程设计创建一个mock aspect。内部使用.NET框架分析器API监视应用的执行,当方法被调用时,CLR会通知Typemock Isolator。此框架可以返回mock值并完全覆盖原始代码。


JustMock是否也使用Debugger API?(顺便说一下,我以为是Profiler API?) - Russ Cam
@Russ Cam:我曾经查阅过相关资料,好像它使用调试API来拦截对象的创建和终结。它也可能使用分析器API,因为这些API非常适合它所做的事情。然而,我并不100%确定,并且目前找不到相关文档。 - LBushkin
@Russ Cam:我在TypeMock网站上找到了相关信息,看起来它确实使用了Profile API - 并且没有提到调试器API,所以我无法确认它是否也使用了调试器API。 - LBushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接