Bre*_*tra 61 language-agnostic tdd unit-testing mocking
模拟密封课程可能会非常痛苦.我目前赞成使用适配器模式来处理这个问题,但是有些事情让我觉得很奇怪.
那么,你嘲笑密封课程的最佳方式是什么?
Java答案非常受欢迎.实际上,我预计Java社区已经处理了这个问题,并且提供了很多东西.
但这里有一些.NET意见:
Mat*_*ias 13
我相信微软研究院的Moles允许你这样做.从Moles页面:
Moles可用于绕过任何.NET方法,包括密封类型中的非虚拟/静态方法.
更新:在即将发布的VS 11版本中有一个名为"Fakes"的新框架,旨在取代Moles:
Visual Studio 11中的Fakes Framework是下一代Moles&Stubs,最终将取代它.假货与Moles不同,因此从Moles转向Fakes需要对代码进行一些修改.此迁移的指南将在以后提供.
要求:Visual Studio 11 Ultimate,.NET 4.5
我的一般经验法则是我需要模拟的对象也应该有一个共同的接口.我认为这是正确的设计,使测试更容易(通常是你做TDD时得到的).有关这方面的更多信息,请参阅Google测试博客最新帖子(参见第9点).
此外,在过去的4年里,我一直在Java工作,我可以说,我可以依靠我创建最终(密封)课程的次数.这里的另一个规则是我应该总是有充分的理由密封一个类,而不是默认密封它.
小智 7
我最近遇到了这个问题,在阅读/搜索网络后,除了使用上面提到的另一个工具之外,似乎没有简单的方法。或者像我一样粗鲁地处理事情:
创建密封类的实例而不调用构造函数。
System.Runtime.Serialization.FormatterServices.GetUninitializedObject(instanceType);
通过反射为属性/字段赋值
YourObject.GetType().GetProperty("PropertyName").SetValue(dto, newValue, null);
YourObject.GetType().GetField("FieldName").SetValue(dto, newValue);
TypeMock 的问题在于它可以为糟糕的设计找借口。现在,我知道它隐藏的通常是其他人的糟糕设计,但是允许它进入您的开发过程很容易导致允许您自己的糟糕设计。
我认为如果你打算使用一个模拟框架,你应该使用传统的框架(比如 Moq)并围绕不可模拟的东西创建一个隔离层,然后模拟隔离层。