文档章节

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

z
 zhv
发布于 2017/05/24 22:35
字数 483
阅读 4
收藏 0

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

代码地址: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就是注入的依赖实例。

© 著作权归作者所有

z

zhv

粉丝 0
博文 22
码字总数 18361
作品 0
西安
QA/测试工程师
私信 提问
依赖注入并非是一种美德

很少能有比Ruby更加灵活的编程语言了,因为‘硬编码’类的引用关系会使测试变得非常困难.如果你把Date date = new Date();隐藏在了Java代码的内部,那么在测试中你怎么将它和一个已知的值进行比...

oschina
2013/01/07
2.6K
5
Mockito 中文文档 二

16. 真实的局部mocks (1.8版本之后) 在内部通过邮件进行了无数争辩和讨论后,最终 Mockito 决定支持部分测试,早前我们不支持是因为我们认为部分测试会让代码变得糟糕。然而,我们发现了部分...

张贴在
2016/06/27
0
0
深入浅出裸测之道---单元测试的单元化

得心应手武器库: nUnit MSpec Rhino Mock AutoMocking 本文所涉及使用的工具, 见前文: 我的.Net武器库 ------ 新.Net架构必备工具列表 三层架构之解耦和单元测试 依赖注入DI很大程度的帮助测...

予沁安
2012/12/14
0
7
通俗的理解java设计模式的准则

本文部分内容摘抄自https://www.cnblogs.com/dolphin0520/p/3919839.html,加入了自己的理解; 一、单一职责原则   原文链接:http://blog.csdn.net/lovelion/article/details/7536542   ...

小勇DW3
2018/08/15
0
0
31天重构学习笔记下载

前言 前两天写了一篇程序猿也爱学英语(上),有图有真相的文章,写作那篇文章只是自己一时兴起,或者说是自己的兴趣使然。文中的观点只是自己的学习心得和体会,属一家之言且鉴于本人不是学...

KnightsWarrior
2013/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离。 在使用线程隔离的时候,有个问题是必须要解决的...

xiaomin0322
36分钟前
2
0
使用 Jenkins + Ansible 实现 Spring Boot 自动化部署101

本文首发于:Jenkins 中文社区 本文要点: 设计一条 Spring Boot 最基本的流水线:包括构建、制品上传、部署。 使用 Docker 容器运行构建逻辑。 自动化整个实验环境:包括 Jenkins 的配置,J...

Jenkins中文社区
40分钟前
2
0
springcloud配置中心和消息总线,学习,记录其中的问题

改造配置中心的客户端,接入消息总线 1.增加pom文件的引用 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20......

夜中孤影
53分钟前
3
0
gzip压缩

tar -zcvf gz包路径 被压缩的路径 tar -zcvf /home/xxx/test.tar.gz hello gz包的路径可以是 完整的也可以相对 , 被压缩的路径 不要全路径 不然压缩包里也会有全路径...

shzwork
59分钟前
3
0
rancher-1

部署rancher 官方快速部署 https://www.cnrancher.com/quick-start/ 部署命令 mkdir /data/rancher -p# 建立存放rancher数据的目录sudo docker run -d --restart=unless-stopped -v /dat......

以谁为师
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部