快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
蓝色突出显示)。建议本质上讲述“当遇到 JNDI 查找时,返回模仿对象而不是继续调用方法。”一旦模仿对象返回到客户机,aspect 的工作就完成了,然后模仿对象接过控制权。 MockCustomerManagerHome (作为真正的 home 对象)只从任何调用它的 create() 方法返回一个客户管理者的模仿版本。因为模仿必须实现 home 主接口,才能够合法地在正确的点进入程序,所以模仿还实现 CustomerHome 的超级接口 EJBHome 的所有的方法,如清单 9 所示。

清单 9. MockCustomerManagerHome

public class MockCustomerManagerHome implements CustomerManagerHome{      public CustomerManager create()       throws RemoteException, CreateException {        return new MockCustomerManager();      }      public javax.ejb.EJBMetaData getEJBMetaData() throws RemoteException {        throw new Error("Mock. Not implemented.");      } //other super methods likewise [...]

MockCustomerManager 很简单。它还为超级接口操作定义存根方法,并提供 ClientBean 使用的方法的简单实现,如清单 10 所示。

清单 10. MockCustomerManager 的模仿方法

public void register(String name) NameExistsException {     if( ! name.equals(ClientBeanTest.NEW_CUSTOMER)){       throw new NameExistsException(name + " already exists!");     } } public String[] getCustomersOver(int years) {     String[] customers = new String[55];     for(int i = 0; i < customers.length; i++){       customers[i] = "Customer Number " + i;     }     return customers; }

只要模仿还在进行,这就可以列为不复杂的。成熟的模仿对象提供了允许测试轻易地定制其行为的 hook。然而,由于本示例的缘故,我尽可能地将模仿的实现保持简单。

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

时间:2011-06-25 IBM Nicholas Lesiecki

使用 aspect 替换对 EJB 组件的调用

跳过 EJB 部署阶段可以在某种程度上减轻开发工作,但尽可能在测试达到最终目的的环境中测试代码也有好处。完全集成应用程序并运行针对部署的应用程序的测试(只替换那些对测试绝对重要的上下文部分)可以预先扫除配置问题。这是 Cactus(一个开放源代码、服务器端测试框架)背后的基本原理。

下面的示例应用程序的一个配置使用了 Cactus 来执行它在应用程序服务器中的测试。这允许测试验证 ClientManager 被正确配置,并能够被容器中的其它组件访问。AspectJ 还可以将其替换能力集中在测试需要的行为上,不去理会其它组件,从而补充这种半集成的测试风格。

CallReplacement aspect 从测试上下文的相同定义开始。它接下来指定对应于 getCustomersOver() 和 register() 方法的 pointcut,如清单 11 所示:

清单 11. 选择 CustomerManager 的测试调用

public aspect CallReplacement{      pointcut inTest() : execution(public void ClientBeanTest.test*());      pointcut callToRegister(String name) :              cflow(inTest()) &&              call(void CustomerManager.register(String)) &&              args(name);      pointcut callToGetCustomersOver() :              cflow(inTest()) &&              call(String[] CustomerManager.getCustomersOver(int));

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号