Topic: 【原创】用Mock Object进行隔离单元测试(Testing in isolation with mock objects) |
Print this page |
1.【原创】用Mock Object进行隔离单元测试(Testing in isolation with mock objects) | Copy to clipboard |
Posted by: sunfmin Posted on: 2004-11-23 11:02 用Mock Object进行隔离单元测试(Testing in isolation with mock objects) 隔离测试就是单独测试一个类或方法里的代码,而不测试里面调用的其他类或方法的代码。即假定调用的其他类或方法都正常执行。 1. 使用Mock Object的场合 -实际对象的行为还不确定。 -实际的对象创建和初始化非常复杂。 -实际对象中存在很难执行到的行为(如网络异常等)。 -实际的对象运行起来非常的慢。 -实际对象是用户界面程序。 -实际对象还没有编写,只有接口等。 2. 简单分析用Mock Object的原因 假定我们有对象A,它内部频繁调用了B中的方法。但是除了调用B的部分还存在自己的逻辑代码。这时,我们只想写A的单体测试,而不想测试B(因为B可能还没编写,只写了实现的接口或者B运行太慢了影响我们的测试效率)。这样的话,我们就需要创建B的Mock对象。 换言之,我们现在不关心B,我们假定B的行为都能正常运行。我们的目标是假定B运行正常的情况下,来对A进行单体测试。 Mock对象就是我们先不用关心的对象,但是我们的关注对象对它有调用,所以我们给关注对象准备个假货让它用。 3. 具体举例 现在我们写好了类AccountService,具体如下
现在我们想测试transfer方法,它内部调用的AccountManager的两个方法。但是对于AccountManager来说,它只是个接口,如下:
所以现在我们必须些个MockAccountManager对象。而且里面的方法体都是非常简单的,就是假定它就返回某某值。 我们这里还有Account类
由于这里的Account类非常的简单,以至于我们在测试AccountService的时候,创不创建Account的Mock对象都一样,那么我们为什么不用真实的对象测试呢。这时我们可以回想一下我们使用Mock对象的那些种场合。 下面是对AccountService的transfer方法的测试
这里我们在假定AccountManager方法都工作正常的情况下,完成了对transfer方法的测试。 4, 动态Mock对象(EasyMock和jMock) EasyMock和jMock都是Open Source,前者在sourceforge,后者在codehaus。对这些OSS的应用可以简化我们对Mock对象的时候,大部分情况下不用手动创建Mock对象。 4.1 EasyMock 现在我们还是要测试AccountService的transfer方法,我们写了AccountService2Tests类。
这里我们没有使用MockAccountManager对象,而是用EasyMock创建的动态Mock对象。所以我们就不用手动编写Mock对象了。 4.2 jMock 下面是用jMock写的测试AccountService的transfer方法的AccountService3Tests单体测试
从上面的测试可以看到,在使用jMock做测试的时候,必须继承的是MockObjectTestCase。因为要使用once,same,returnValue等方法。其他的和EasyMock基本上相似,只是jMock更容易理解一点。 5. 参考资料 -Manning - JUnit in Action -http://www.easymock.org/Documentation.html -http://www.jmock.org/getting-started.html |
2.Re:【原创】用Mock Object进行隔离单元测试(Testing in isolation with mock objects) [Re: sunfmin] | Copy to clipboard |
Posted by: sunfmin Posted on: 2004-11-23 11:03 源代码 mock_src.rar (5.82k) |
3.Re:【原创】用Mock Object进行隔离单元测试(Testing in isolation with mock objects) [Re: sunfmin] | Copy to clipboard |
Posted by: floater Posted on: 2004-11-23 12:12 Good. Two comments: 1. For easymock, class mocks and interface mocks are a little different, make sure the mockextension.jar is in the classpath. 2. I would normally move the mock object creation to a seperate method, if it's tedious to create it, or at least create them first before declaring others. |
4.Re:【原创】用Mock Object进行隔离单元测试(Testing in isolation with mock objects) [Re: sunfmin] | Copy to clipboard |
Posted by: sunfmin Posted on: 2004-11-23 12:56 谢谢你的回复 我会继续学习使用easymock来看看class mocks和interface mocks有什么不同。 是的 mock object creation 应该放在setup或其他的方法里。 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |