- 浏览: 456382 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (354)
- 面向对象分析设计/系统架构 (12)
- Mysql/Orcal11g (13)
- JSP/Java//Python/Xharbour (66)
- 软件测试 (21)
- 信息安全小知识 (1)
- Android (5)
- IT生活/哲学/兵法 (23)
- 软件工程/UML/需求分析学习与实践 (6)
- 操作系统/网络/组成原理 (9)
- 持续集成Maven/Hudson/自动化测试 (9)
- eBay /Paypal developer (10)
- Hadoop/HBase/Solr (0)
- 重构分析及其思考 (2)
- 企业架构 (7)
- 分析模式/设计模式 (4)
- SSH学习笔记 (1)
- Quartz及其JWatch监控 (0)
- Linux服务器 (0)
- ExtJs学习笔记 (1)
- 重读java编程思想 (3)
- ESB/SOA/WebServices (0)
- SpringMVC/Struts/Hibernate/Spring (7)
- Xharbour/Pelles C/ SQLite3 (0)
- Magento 电商 (1)
- Object C (1)
- note/redis (0)
- SpringBoot (0)
最新评论
-
snow8261:
太粗略了。
企业架构之数据架构 -
haithink:
面试成功没?
JVM 加载Class文件的原理及其机制 -
feisi0003731843:
不好意思我没有重启,重启后好多了,可有的地方回放还是不成功的。 ...
Selenium IDE测试ExtJs一种测试解决办法 -
feisi0003731843:
这个好像不行吧,我试过了不好使啊。还是用id来做的。不能用啊。 ...
Selenium IDE测试ExtJs一种测试解决办法 -
yuchensuifeng:
您好,静态页面是可以的,但是,我指定error-page为js ...
JSP创建错误处理页面
问题:
你想测试一个对象,但这个对象内部还初始化其他对象,这使得测试变得困难
背景:
面向对象的设计是双刃剑。我们使用聚合来表明一个对象拥有另外一个对象,比如大多数情况下一个汽车都有自己的轮子。而另一方面,为了单独测试一个对象,我们需要将对象像拼图游戏一样拼凑起来。这就是说,测试更期望对象使用组合而不是聚合。如果你要测试的对象初始化了其他的对象,那么只有在保证内部对象的正确性的前提下,你才能测试这个对象,而这就违反了单独测试一个对象的原则。
我们不安地发现,仍然有大量的程序员对进行测试的好处一无所知。这致使他们过多地使用聚合。他们的设计中充满了初始化其他对象的对象,或者常常从全局的位置获取对象。这种编程办法,如果不改进的话,就会造成强耦合的架构,导致测试难以进行。我们知道:我们继承了大量这种设计,甚至直接创建了它们。下面的诀窍介绍了一个基本的测试技巧,它可以带来程序设计上的一些提高,是单独的测试一个对象成为可能。
诀窍:
为了处理这个问题,你要将要测试的对象的内部对象用其他的对象代替。这就有两个问题需要解决:
1. 如何创建这个对象所包含的对象的替身
2. 如果将它传递给要测试的对象
为了简化讨论,我们使用术语“测试对象”(不要与对象测试相混淆),用来指代那些你要测试的类或者接口的实例。有多种不同的测试对象:假的、残缺的、模拟的。
创建一个接口的测试对象很简单:只要创建一个类,并用最简单的方法实现这个接口就可以了,这是最简单的测试对象。在这里我们使用EasyMock(www.easymock.org)来创建接口的测试对象。之所以使用这个包,是因为它不仅可以避免我们重复的劳动,还能保证我们仿造的接口对象的一致性和统一性。这让我们的测试程序更容易理解。
创建一个类的测试对象,可以创建它的一个子类,然后仿造它的全部方法,或者干脆屏蔽它的全部方法。一个仿造的方法返回某种可预见的、有意义的、硬编码的值,而一个屏蔽的方法不做任何有意义的事情,只需要实现编译要求即可。你也许会发现:在要测试的对象中声明接口,然后在测试时转变为具体类的对象是很有好处的。因为这样你就可以使用前面介绍的EasyMock了。此外,如果你在对象中要使用其他的对象,最好将其声明为接口,这样你的设计就更有弹性。
至于第二个问题,我们有两种方法可以让你将一个测试对象传递给另一个要测试的对象:一种是改造构造函数,另一种是添加一个set方法。我们认为改造构造函数的方法比较简单,这样可以避免在测试中再去调用set方法。为了说明,可以看个例子
注意,Deployment使用类级别的方法Deployer.getInstance()来生成Deployer。如果你想仿造一个Deployer,你需要将一个Deployer通过某种方法传递给Deployment。我们推荐使用构造函数来传递,所有新加一个构造函数并创建一个实例来保存Deployer;
怎么好像没看见Deployer.getInstance()方法?我们不能丢掉这段代码:现在我们删除了无参数的构造函数,那么我们需要添加一个新的构造函数。
现在,当产品代码使用无参构造函数创建一个Deployment时,就可以观察到期望的行为:Deployment将使用Singleton Deployer。不过,在我们的测试中,我们使用一个假的Deployer,这样做可以模拟诸如目标文件不存在等情况。下面的代码是一个“故障测试”的Deployer------它永远都认为目标文件不存在
现在,我们可以测试当Deployer部署失败的时候,Deployment如何表现。
这个测试演示了如何替换一个对象中引用的测试对象,同时也介绍了如何通过继承仿制测试对象。我们将使用的对象变成了构造函数的一个可选参数:如果我们没有提供的话,那么类也会自动察觉,并创建一个默认的。
你想测试一个对象,但这个对象内部还初始化其他对象,这使得测试变得困难
背景:
面向对象的设计是双刃剑。我们使用聚合来表明一个对象拥有另外一个对象,比如大多数情况下一个汽车都有自己的轮子。而另一方面,为了单独测试一个对象,我们需要将对象像拼图游戏一样拼凑起来。这就是说,测试更期望对象使用组合而不是聚合。如果你要测试的对象初始化了其他的对象,那么只有在保证内部对象的正确性的前提下,你才能测试这个对象,而这就违反了单独测试一个对象的原则。
我们不安地发现,仍然有大量的程序员对进行测试的好处一无所知。这致使他们过多地使用聚合。他们的设计中充满了初始化其他对象的对象,或者常常从全局的位置获取对象。这种编程办法,如果不改进的话,就会造成强耦合的架构,导致测试难以进行。我们知道:我们继承了大量这种设计,甚至直接创建了它们。下面的诀窍介绍了一个基本的测试技巧,它可以带来程序设计上的一些提高,是单独的测试一个对象成为可能。
诀窍:
为了处理这个问题,你要将要测试的对象的内部对象用其他的对象代替。这就有两个问题需要解决:
1. 如何创建这个对象所包含的对象的替身
2. 如果将它传递给要测试的对象
为了简化讨论,我们使用术语“测试对象”(不要与对象测试相混淆),用来指代那些你要测试的类或者接口的实例。有多种不同的测试对象:假的、残缺的、模拟的。
创建一个接口的测试对象很简单:只要创建一个类,并用最简单的方法实现这个接口就可以了,这是最简单的测试对象。在这里我们使用EasyMock(www.easymock.org)来创建接口的测试对象。之所以使用这个包,是因为它不仅可以避免我们重复的劳动,还能保证我们仿造的接口对象的一致性和统一性。这让我们的测试程序更容易理解。
创建一个类的测试对象,可以创建它的一个子类,然后仿造它的全部方法,或者干脆屏蔽它的全部方法。一个仿造的方法返回某种可预见的、有意义的、硬编码的值,而一个屏蔽的方法不做任何有意义的事情,只需要实现编译要求即可。你也许会发现:在要测试的对象中声明接口,然后在测试时转变为具体类的对象是很有好处的。因为这样你就可以使用前面介绍的EasyMock了。此外,如果你在对象中要使用其他的对象,最好将其声明为接口,这样你的设计就更有弹性。
至于第二个问题,我们有两种方法可以让你将一个测试对象传递给另一个要测试的对象:一种是改造构造函数,另一种是添加一个set方法。我们认为改造构造函数的方法比较简单,这样可以避免在测试中再去调用set方法。为了说明,可以看个例子
public class Deployment{ public void deploy(File targetFile throws FileNotFoundException{ Deployer.getInstance().deploy(this, targetFile); } }
注意,Deployment使用类级别的方法Deployer.getInstance()来生成Deployer。如果你想仿造一个Deployer,你需要将一个Deployer通过某种方法传递给Deployment。我们推荐使用构造函数来传递,所有新加一个构造函数并创建一个实例来保存Deployer;
public class Depliyment{ private Deployer deployer; public Deployment(Deployer deployer){ this.deployer = deployer; } public void deploy(File targetFile)throws FileNotFoundException{ deployer.deploy(this, targetFile); } }
怎么好像没看见Deployer.getInstance()方法?我们不能丢掉这段代码:现在我们删除了无参数的构造函数,那么我们需要添加一个新的构造函数。
public class Deployment{ private Deployer deployer; public Deployment(){ this(Deployer.getInstance()); } public Deployment(Deployer deployer){ this.deployer = deployer; } public void deploy(File targetFile){ deployer.deploy(this, targetFile); } }
现在,当产品代码使用无参构造函数创建一个Deployment时,就可以观察到期望的行为:Deployment将使用Singleton Deployer。不过,在我们的测试中,我们使用一个假的Deployer,这样做可以模拟诸如目标文件不存在等情况。下面的代码是一个“故障测试”的Deployer------它永远都认为目标文件不存在
public class FileNotFoundDeployer extends Deployer{ public void deploy(Deployment deployment, File targetFile)throws FileNotFundException{ throw new FileNotFoundException(targetFile.getPath()); } }
现在,我们可以测试当Deployer部署失败的时候,Deployment如何表现。
public void testTargetFileNotFound() throws Exception{ Deployer fileNotFoundDeployer = new FileNotFoundDeployer(); Deployment deployment = new Deployment(fileNotFoundDeployer); try{ deployment.deploy(new File("hello")); fail("Found target file?!"); } catch(FileNotFoundException expected){ assertEquals("hello", expected.getMessage()); } }
这个测试演示了如何替换一个对象中引用的测试对象,同时也介绍了如何通过继承仿制测试对象。我们将使用的对象变成了构造函数的一个可选参数:如果我们没有提供的话,那么类也会自动察觉,并创建一个默认的。
发表评论
-
YourKit Java Profiler 9.5.1 分析思考一
2010-12-10 09:06 2474以下是我对使用YoutKit 对程序分析的一些想法! 程序分 ... -
YourKit Java Profiler 9.5.1 试用总结一
2010-12-06 09:15 3759近日接到学习任务研究下YourKit来解决项目中对内存 ... -
性能测试(并发负载测试)测试分析
2010-01-04 10:47 1066声明:此文章是从网络上转载下来的,至于真实出处无法找到。 ... -
使用JUnit创建TestCase
2009-12-29 22:05 3134在学会了对单个方法、类、接口等进行测试后,接着看看这么创建 ... -
如何防范SQL注入<测试篇>
2009-12-24 11:48 4211前一篇是关于编程防 ... -
Junit---Introduce a Base Test Case
2009-12-21 20:24 1130问题: 如果有一个通用方法的集合并且希望在测试中尽可能多的 ... -
怎么提取一个测试层次结构
2009-12-18 20:29 1120问题: 如果有多个 ... -
怎么抽取一个测试模块?
2009-12-17 20:21 904[/b][b]问题: 当为一个产品类编写了好几个测试,它 ... -
Junit(Let collections compare themselves)
2009-12-08 19:26 1537问题: 你想验证容器的内容,而你第一个想到的办法是逐个 ... -
测试是否抛出正确的异常(Test throwing the right exception)
2009-12-07 21:28 5313问题: 你是否想 ... -
Test a JavaBean
2009-12-05 18:10 923问题: 如果要测试一 ... -
Test an interface(测试接口)
2009-11-30 22:52 2313问题: 你是否想过怎么测试接口,但是又苦于接口没有办法 ... -
Test a setter(Junit 测试setter方法)
2009-11-29 14:27 1808问题: setter方法怎 ... -
Junit Test a getter
2009-11-28 12:16 1099问题: 怎么测试一个对象的get方法?怎么判断哪些需要 ... -
Junit测试构造函数
2009-11-28 00:22 5112构造函数对于测试者 ... -
测试没有返回值的方法
2009-11-26 22:28 7140在使用JUnit进行单元测试的时候,常会碰到返回值为viod的 ... -
JUnit 测试学习笔记二
2009-11-16 22:43 1460现在看看JUnit怎么测试equals()方法 首先分析下e ... -
JUnit测试学习笔记一
2009-11-09 22:25 2053在软件测试中,最基 ... -
何为软件可测试
2009-10-26 11:04 814软件工程发展了二十多 ... -
自动化测试
2009-10-13 09:34 1059关于自动化测试现在 ...
相关推荐
3 edition (October 30, 2004) <br>Applying UML and Patterns is the world\'s #1 business and college introduction to \"thinking in objects\"and using that insight in real-world object-oriented ...
This is a very useful resource for developers who want to shift from Objective C, C#, Java, Python, JavaScript, or other object-oriented languages to Swift What You Will Learn Build solid, stable, ...
Capture objects from real-world elements and create object-oriented code that represents them Learn the latest ES6 features and how to test and debug issues with JavaScript code using various modern ...
relational mapping Practical test-driven development: constructing automated unit test suites and using mock objects to \"test from the inside out\" Leveraging the full value of Eclipse and other IDEs...
This method aims to provide a standard and predictable set of tests that can be used to check software before it is uploaded to an FTP site. Let’s delve into the details of this automated testing ...
would have features that check whether the object is actually valid to print, an electrical CAD tool would simulate the physics of electricity running through copper, and a film special effects suite...
Add behavior to an object that is going away, including object persistence. Chapter 14, Some Advanced Object Topics Use multiple inheritance, automatic methods, and references to filehandles. ...
To make it easier for novices to develop programs, the author uses an object-centered design approach that helps students identify the objects in a problem and the operations needed; develop an ...
The definition of an inline function needs to be in a header file, so that the compiler has the definition available for inlining at the call sites. However, implementation code properly belongs in ....
return Objects.equals(name, other.name) && age == other.age; } ``` 在测试类 `Test_equals.java` 中,会创建多个 `Person` 对象,并使用 `equals()` 方法进行比较,以验证是否能正确判断对象的相等性。 总之...
of 2D images, an object to assist in rendering to a surface or an environment map and objects for the rendering of special e®ects. Chapter 19 describes the mesh objects provided by D3DX. The mesh ...
It allows you to test your app without needing an actual device. - **Choosing Devices**: The simulator supports multiple device types (e.g., iPhone, iPad) and versions of iOS. Choosing the right ...
Explore the Underscore.js library by example using a test-driven development approach About This Book Understand and learn to apply functional programming principles using the built-in functions of ...
PEP 372: Adding an Ordered Dictionary to collections PEP 378: Format Specifier for Thousands Separator PEP 389: The argparse Module for Parsing Command Lines PEP 391: Dictionary-Based Configuration...
For each connection you can now define an initialization script that will be executed for each database session that is created for the connection Test Manager enhancements Notes tab page added ...
Then, the authors address the mechanics of the language itself, providing illustrations of how Python conceives of numbers, strings, and other objects as well as the operators you use to work with ...
When viewing or editing LOB's the contents for common data formats will automatically be recognized, so that an external viewer or editor can be invoked: Changes made and saved in an external editor ...