快速业务通道

AspectJ和模仿对象的测试灵活性 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
复的工作

即便您可以完全控制系统状态,基于状态的测试还是可以产生不需要的重复测试工作 ― 而且您不希望第二次编写相同的测试。

让我们将测试应用程序作为示例。如果我控制 CustomerManager EJB 组件,那么我就已经拥有了一个可以验证组件行为正确性的测试。我的客户机代码实际上并不执行任何与向系统添加新的客户相关的逻辑;它只是将操作交给 CustomerManager 。那么,我为什么要在这里重新测试 CustomerManager 呢?

如果某个人改变了 CustomerManager 的实现以使其对相同数据作出不同响应,我就必须修改两个测试,从而跟踪改变。这有一点过耦合测试的味道。幸运的是,这样的重复是不必要的。如果我可以验证 ClientBean 与 CustomerManager 正确通信的话,我就有足够证据证明 ClientBean 是按其工作方式工作的。模仿对象测试恰恰允许您执行这种验证。

模仿对象测试

模仿对象使单元测试不会测试太多内容。模仿对象测试用模仿实现来代替真正的合作者。而且模仿实现允许被测试的类和合作者正确交互的简单验证。我将用一个简单的示例来演示这是如何实现的。

我们测试的代码将从客户机-服务器数据管理系统删除一个对象列表。清单 4 展示了我们要测试的方法:

清单 4. 一个测试方法

public interface Deletable {        void delete();      }      public class Deleter {        public static void delete(Collection deletables){          for(Iterator it = deletables.iterator(); it.hasNext();){            ((Deletable)it.next()).delete();          }        }      }

简单的单元测试就可能创建一个真正的 Deletable ,然后验证它在调用 Deleter.delete() 后将消失。然而,为了使用模仿对象测试 Deleter 类,我们编写了一个实现 Deletable 的模仿对象,如清单 5 所示:

清单 5. 一个模仿对象测试

public class MockDeletable implements Deletable{        private boolean deleteCalled;        public void delete(){          deleteCalled = true;        }        public void verify(){          if(!deleteCalled){            throw new Error("Delete was not called.");          }        }      }

AspectJ和模仿对象的测试灵活性(5)

时间:2011-06-25 IBM Nicholas Lesiecki

下面,我们将在 Deleter 的单元测试中使用模仿对象,如清单 6 所示:

清单 6. 一个使用模仿对象的测试方法

public void testDelete() {        MockDeletable mock1 = new MockDeletable();        MockDeletable mock2 = new MockDeletable();        ArrayList mocks = new ArrayList();        mocks.add(mock1);        mocks.add(mock2);        Deleter.delete(mocks);        mock1.verify();        mock2.verify();      }

在执行时,该测试将验证 Deleter 成功地调用集合中每个对象上的 delete() 。模仿对象测试按这种方式精确地控制被测试类的环境,并验证单元与它们正确地交互。

模仿对象的局限性

面向对象的编程限制了模仿对象测试对被测试类的执行的影响。举例来说,如果我们在测试一个稍微不同的 delete() 方法 ― 也许是在删除一些可删除对象之前查找这些对象的列表的方法 ― 测试就不会这么容易地提供模仿对象了。下面的方法使用模仿对象可能很难测试:

清单 7. 一个很难模仿的方法

public static void deleteAllObjectMatching(String cr

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号