当一个遗留的静态方法中使用了诸如依赖于数据库或WebService之类的外部资源时,为了确保单元测试快速的运行,可以使用FactoryManager来进行依赖分离,而如果是实例方法的话,则可以用构造函数或Setter方法进行设置(这里不举例)。
惯例,直接上代码:
public class ProductRepositoryFactoryManager
{
public static IProductRepositoryFactory Factory = new ProductRepositoryFactory(); //默认为数据库实现
}
public interface IProductRepositoryFactory
{
IProductRepository Instance();
}
public class ProductRepositoryFactory : IProductRepositoryFactory
{
public IProductRepository Instance()
{
return new ProductDBRepository();
}
}
public interface IProductRepository{
ProductEntity LoadById(Id);
}
public class ProductDBRepository : IProductRepository{
//实现略
}
public class Product
{
public static Product LoadById(Int32 Id)
{
//var productEntity = new ProductDBRepository().LoadById(Id); 遗留代码,修改之前
var productEntity = ProductRepositoryFactoryManager.Factory.Instance().LoadById(Id);//修改之后,使用FactoryManager来负责实例使用哪个IProductRepository的实现
if(productEntity == null) throw new ArgumentException();
return Mapp(productEntity);
}
}
[TestClass]
public class ProductTests
{
[TestMethod]
public void LoadById_ExsitsId_Loaded()
{
ProductRepositoryFactoryManager.Factory = new StubProductRepositoryFactory(); //替换为使用模拟实现
Product product = Product.LoadById(1);
Assert.IsNotNull(product);
}
class StubProductRepositoryFactory:IProductRepositoryFactory
{
//实现接口,返回模拟的Repository,以解除和数据库的依赖,使单元测试快速运行
public IProductRepository Instance()
{
return new StubProductRepository();
}
}
class StubProductRepository : IProductRepository{
//模拟实现,略
}
}