桩破除依赖1-重构代码和参数注入

抽取接口使底层实现可替换

代码地址:http://git.oschina.net/zhv/UnitTest

首先将第一章的代码重构,抽取出实现代码,放到FileExtensionManager类中。

    public class LogAnalyzer
    {
        public bool WasLastFileNameValid { get; set; }

        public bool IsValidLogFileName(string fileName)
        {
            //使用抽取出来的类
            FileExtensionManager mgr =
                new FileExtensionManager();
            return mgr.IsValid(fileName);
        }
    }
    
    //首先定义出这个抽取的类
    class FileExtensionManager
    {
        public bool IsValid(string fileName)
        {
            //读取文件
        }
    }

然后定义ExtensionManager的接口IExtensionManager并实现

class FileExtensionManager:IExtensionManager
{
    public bool IsValid(string fileName)
    {
        //读取文件
    }
}
//然后定义新接口
public interface IExtensionManager
{
    bool IsValid(string fileName);
}

public bool IsValidLogFileName(string fileName)
{
    //定义这个接口的类型变量
    IExtensionManager mgr =
        new FileExtensionManager();

    return mgr.IsValid(fileName);
}

现在就创建了一个提供IsValid(string)方法的接口IExtensionManager,用FileExtensionManager实现这个接口。代码功能没有变,但是现在可以用自己的伪造的扩展名管理器来代替真实 扩展名管理器了

//这个是总是返回true的简单桩代码
//使用Fake说明这个类的对象类似另一个对象,既可能用作模拟对象,也可能用作桩
public class AlwaysValidFakeExtensionManager: IExtensionManager
{
    //实现IExtensionManager接口
    public bool IsValid(string fileName)
    {
        return true;
    }
}

现在虽然有了一个接口和两个实现此接口的类,但是被测试的方法还是对具体类进行直接调用。

public bool IsValidLogFileName(string fileName)
{
    IExtensionManager mgr =
        new FileExtensionManager();

    return mgr.IsValid(fileName);
}

所以必须想办法让被测试的方法调用伪对象,而不是IExtensionManager的原本实现,因此需要在代码中引入一个接缝,然后插入桩

依赖注入:在被测试单元中注入一个伪实现

参数注入

给方法签名添加一个参数,从而给这个方法传入一个(伪造的)依赖实例

Method(string,int,FakeClass)
//其中FakeClass就是注入的依赖实例。

转载于:https://my.oschina.net/zhv/blog/908497

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值