• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

有效应用的设计模式与灵活的单元测试途径

发布: 2008-7-30 09:53 | 作者: 熊伟 | 来源: IBM | 查看: 53次 | 进入软件测试论坛讨论

领测软件测试网

替换实现

通 过 Factory Method 替换被创建对象可以满足一些修改程序运行路径的需求,但是,这种方法以子类化为前提,具有很强的侵入性,并且在编写单元测试时,开发人员需要同时负责 Mock Objects 的开发,供 Factory Method 调用,因此,编码量往往会比较大,单元测试开发人员也需对所使用的公共模块的内部结构有十分清楚的认识。即使可以使用公共的 Mock Objects 实现避免代码重复,往往也需要修改业务逻辑中公共服务相关对象的创建代码,这一点对于应用公共模块的业务逻辑的单元测试可能不太适合。

在 笔者曾参与设计、开发的某应用系统中,有一个专门的数据库缓冲(Cache)公共服务,该 Cache 负责完成与数据库交互,实现数据的存取,并缓存数据以提高后续访问的效率。对于涉及数据库缓冲的业务逻辑的单元测试,需要一个替代方案来替代已有的数据库 缓冲,以避免直接访问实际数据库,但又要保证这个替换不会影响到被测试单元的实现。

为了解决这个问题,我们并 没有直接替换 Cache 创建处的代码,因为这些代码遍布在业务代码中,直接替换 Cache 创建代码无疑会侵入业务逻辑,并需要大量使用子类化。为了尽可能降低对业务逻辑的影响,我们维持了原有 CacheFactory 的接口,但是将 CacheFactory 的实现委托(Delegate)给另一个实现类完成,以下是 CacheFactory 实现的伪代码:

package com.cachefactory.demo;
public abstract class CacheFactory {
private static CacheFactoryinstance = new DelegateCacheFactory();
private static CacheFactorydelegate;
protected CacheFactory() {
}

// CacheFactory is a singletonpublic
static CacheFactory getInstance() {
return instance;
}

// the implementation can be changedprotected
static void setDelegate(CacheFactory instance) {
delegate= instance;
}

public abstract Cache getCache(Object... args);

// redirect all request to delegateeprivate
static class DelegateCacheFactoryextendsCacheFactory {
private DelegateCacheFactory() {
}

public Cache getCache(Object... args) {
return delegate.getCache(args);
}
}
}

与 CacheFactoryImpl 类似地,我们实现了一个 MockCacheFactory,但与 CacheFactoryImpl 不同的是,这个 MockCacheFactory 所创建的 MockCache 对象虽然与真正的 Cache 实现了相同的接口,但是,它的内部实现却是基于 HashMap 的,因此,可以很好地满足单元测试快速、方便地运行的需要。

单元测试时,只需要在 setUp 时调用执行如下操作:

setDelegate(new MockCacheFactory());

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

43/4<1234>

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网