● 排除依赖关系
开发者现在应该开始测试实驱动类。首先,包括一个对源文件(TestSource.cpp)测试目标的定义(CMapExampleSmsEngine)
#include "cmapexamplesmsengine.h" |
然后从.mmp文件中用非注释行的方式把测试目标函数加到工程中。
SOURCE CMapExampleSMSEngine.cpp |
这里有一个非常难的部分:在执行的过程中测试性是不被考虑的,所以可能会有联缠,私有区域等困难,使得单元测试具有挑战性。在我们的实例中,会使用信息类>RSendAsMessage和RSendAs,但是模拟结果是很困难的。
解决问题的办法是把默认的库函数替换为开发者自己的。当不能和现有的库相连,但使用开发者所需要的库函数就可实现时,该方法可被使用。当我们缺失一个.mmp文件中的库函数时,编译器将会编译源代码,但链接部分将无法生成最终代码,报错如下:
Undefined symbol: 'void RSendAsMessage::CreateL(class RSendAs &, class TUid) (?CreateL@RSendAsMessage@@QAEXAAVRSendAs@@VTUid@@@Z)' |
开发者的任务是使用一些函数实现这种方法,以达到测试需求。此时首先可选择的是简单的空函数,方法是将函数返回值设为NULL或者其他硬编码默认值。注意此方法金用于目标测试工程需要使用函数时(例如,并不需要使用29种所有的RSendAsMessage方法)。空函数法类似于以下几行实现链接的代码:
void RSendAsMessage::CreateL(RSendAs &, TUid) {} TInt CMsvStore::HasBodyTextL(void) const { return KErrNone; } CMsvStore * CMsvEntry::ReadStoreL(void) { return NULL; } |
当所有缺失的方式都被使用之后,目标工程编译并链接。此时测试工程将正常无误运行。
● 实现测试
现在我们开始在实际条件下测试目标。任何有测试前缀的方式可看作是一个由框架执行的测试实例。测试实例被执行之后,该测试框架在调用测试法和tearDown()之前调用setUp()函数。安装时应把测试目标设置成默认状态。测试实例中,只需要在已经实例化的测试目标中运行该方式以证实使用的方式和状态是我们预期的。测试目标和设置时生成的其它源代码需被销毁。我们可按以下方式设置:
void CMapExampleSmsEngineTest::setUp() { iObserver = new (ELeave) DummyObserver(); iTarget = CMapExampleSmsEngine::NewL(iObserver); } |