[.NET]使用FactoryManager为遗留的静态方法作单元测试

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值