在构造过程中驱动器需要一个观察器。对参数可使用伪排除(查看附录A的详细介绍)。释放资源时执行销毁。
void CMapExampleSmsEngineTest::tearDown()
{
delete iTarget;
delete iObserver;
}
首先应拿来测试的实例是短信发送。这是个很简单的过程:该函数被调用而且如果他没有退出(抛出异常)那么这个测试用例就通过了。
void CMapExampleSmsEngineTest::testSendMessage()
{
iTarget->SendSmsL(_L("12345678"), _L("abcd"));
}
短信发送可能会失败。RSendAsMessage::SetBodyTextL()可被退出以模拟异常。然后执行测试实例来确保SendSmsL退出。尽管如此,仅在测试实例里SetBodyTextL才能退出而且测试实例应控制该过程。实现控制的一种方法是运用全局变量,在调用测试目标时设置该测试实例,然后在变量的基础上实现SetBodyTextL。另一种更普遍的方法是定义一个全局函数指针,该指针在定义时被SetBodyTextL调用。测试实例代码如下:
1 // global function pointer
2 void (*gRSendAsMessage_SetBodyTextLHook)() = NULL;
3
4 void ThrowExceptionL()
5 {
6 User::Leave(KErrGeneral);
7 }
8 void RSendAsMessage::SetBodyTextL(const TDesC16& a)
9 {
10 if(gRSendAsMessage_SetBodyTextLHook)
11 gRSendAsMessage_SetBodyTextLHook();
12 }
13
14 void CMapExampleSmsEngineTest::testSendMessageExceptions()
15 {
16 gRSendAsMessage_SetBodyTextLHook = ThrowExceptionL;
17 TS_ASSERT_THROWS_ANYTHING(
18 iTarget->SendSmsL(_L("12345678"), _L("abcd"))
19 );
20 }
21
2 void (*gRSendAsMessage_SetBodyTextLHook)() = NULL;
3
4 void ThrowExceptionL()
5 {
6 User::Leave(KErrGeneral);
7 }
8 void RSendAsMessage::SetBodyTextL(const TDesC16& a)
9 {
10 if(gRSendAsMessage_SetBodyTextLHook)
11 gRSendAsMessage_SetBodyTextLHook();
12 }
13
14 void CMapExampleSmsEngineTest::testSendMessageExceptions()
15 {
16 gRSendAsMessage_SetBodyTextLHook = ThrowExceptionL;
17 TS_ASSERT_THROWS_ANYTHING(
18 iTarget->SendSmsL(_L("12345678"), _L("abcd"))
19 );
20 }
21