看板 C_and_CPP 關於我們 聯絡資訊
最近在專案做了一些 unit test 有時候會遇到需要 fake class 的時候 然後突然就遇到了一個情況, 不知如何 design 較佳 上來請教一下諸位高手 我們做 ClassA 的 unit test, 其中會使用到 ClassB 如下: class ClassB { public: void Func1(); void Func2(); int Save(); ... } 其中因為 ClassB.Save() 會存取 DB, 因此在 unit test 時 我繼承 ClassB 做了一個 fake(mock) class: ClassBFake 然後 #ifdef TEST #define ClassB ClassBFake #endif 基本上大多情況都運作正常, 直到遇到下面的情況, 突然覺得 something wrong """ int ClassA::CorrectData(vector<ClassB> &BVec); { CorrectDataInClassB(BVec); ... // blah for BVec ... } Compile error XD 原因自然是因為 vector<ClassB> 和 vector<ClassBFake> 的衝突了 那麼要怎麼做才是使用 Fake(mock) class 比較完善的方法呢? 不知道有沒有人有過這個需求 XD // 總不會還要寫一個 CorrectData(vector<ClassBMock>&) 吧 (假議題) 這樣我也還要對 CorrectDataInClassB 做一樣的事 (崩潰) 再不然就是把樓上這兩個傢伙全寫成 Template function (...) 架構上的更正也可以是個選項... Any idea? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.120.41.39 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1409649640.A.BCD.html ※ 編輯: Ebergies (59.120.41.39), 09/02/2014 17:42:58
jackace: ClassBMock都已經繼承B了為什麼不用polymorphism解決 09/02 18:23
jackace: 要是怕polymorphism會有overhead就用#ifdef 沒TEST的時候 09/02 18:25
jackace: B的function不要virtual 09/02 18:25
firose: ClassB 不都換成 ClassBMock 了, 怎麼還會有問題? 09/02 19:16
Ebergies: 沒說清楚, CorrectDataInClassB 是 library 的 function 09/02 20:53
Ebergies: 因此它不會吃到 define, 其他有使用到 ClassB 的部分的 09/02 20:54
Ebergies: 確是像一樓說的由多型解決了 09/02 20:55
Ebergies: 但這樣說來的話, 既然 CorrectDataInClassB 不是這個 09/02 21:00
Ebergies: ClassA 的 function, 或許還真的得 fake 它才合理 09/02 21:01
firose: SUT 是 ClassA::CorrectData 其他不相干的應該可以 Fake 09/02 21:14
jackace: 只吃vector<ClassB>的lib func是問題所在 你怎麼改都沒用 09/03 00:02
Ebergies: Thanks a lot everyone ~ LOL 09/03 20:17
Killercat: mocking請靠繼承 不要用template耍花招 會有問題 :P 09/05 12:33
rifiz: 有點疑問 ClassBMock 跟 ClassBFake差別在哪? 09/10 14:03
我覺得應該只是用詞不同, 我有混用嗎!!? @@
rifiz: 還有上色不要用藍色 幾乎看不到阿阿阿阿 09/10 14:03
因為是假議題所以請無視... 哈哈~ ※ 編輯: Ebergies (59.120.41.39), 09/11/2014 20:08:58