单元测试不可测试那些类(无抽象、静态类、静态方法)
实际上“单元测试不可测试那些类(无抽象、静态类、静态方法)”是个伪命题,因为事实是:无抽象、静态类、静态方法都是不可单元测试的。那么,如果我们要写出可测试的代码,又要用到这些静态类等,该怎么办,实际上我们需要两个步骤: 1:为它们写一个包装类,让这个包装类是抽象的(继承自接口,或者抽象类,或者方法本身是Virtual的); 2:通知客户端程序员,使用包装类来代替原先的静态类来写业务逻辑; 实际上,微软也是这么干的,我在上一篇博文《 单元测试WebForm的UI逻辑及文件上传 》写到,最典型的不可测试类,那就是WebForm架构的网站中,对Response等的模拟。查看Response这个类: namespace System.Web { public sealed class HttpResponse { ... } } 很明显,如果我们在某个WebForm的后台方法中,直接使用它的话: protected void Page_Load(object sender, EvengArgs e) { this.Response.Write("test u"); } 该后台代码逻辑就无法进行单元测试了,因为类似MOQ的框架所依赖的是代码本身具有可被重写行,如果某个类本身是静态的,就无法在运行时用模拟类替换掉实际类。 所以,写一个包装类吧,我们看到微软为Response写了一个包装类