当一个遗留的静态方法中使用了诸如依赖于数据库或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{
//模拟实现,略
}
}

本文介绍了一种通过FactoryManager进行依赖注入的方法,用于优化遗留代码中的单元测试过程。通过将具体的实现细节从测试中剥离出来,使得测试更加关注业务逻辑而非基础设施层,从而提高测试效率。

3337

被折叠的 条评论
为什么被折叠?



