在 C++ 當中,常常慣用 RAII 的技巧,讓 Object 在進入 Function/Block 的範圍內獲取資源,離開範圍內釋放資源。舉例來說:
void example() { File file("output.log"); file.write("test"); }
在這種情況下,通常都會在測試程式中另外實作一組假的 File。不過,因為 Object 生成的時機是在進入受測的函式中,沒有機會用 ON_CALL 去控制 Mock Object 的行為。
所幸,你可以用下面的方式將 File 的實作,交給另外一個擁有相同介面的類別。這麼一來,我們還是可以控制這個新的類別。
所幸,你可以用下面的方式將 File 的實作,交給另外一個擁有相同介面的類別。這麼一來,我們還是可以控制這個新的類別。
// MockFile 是真正使用 Googlemock 的類別 class MockFile { public: MOCK_METHOD0(write, void( char *szLine)); }; MockFile *g_pMockFile = NULL; // 將 File::write 導到 MockFile 上 File::write(char *szLine) { g_pMockFile->write(szLine); }; TEST_F(TestSuite, test_file_write) { MockFile mockFile; EXPECT_CALL(mockFile, write(_)); // 設定給 File::write() 使用這個 Mock Object g_pMockFile = &mockFile; example(); }
如此一來,就可以使用 Googlemock 幫我們取代掉 RAII 技巧所使用的類別。
No comments:
Post a Comment