[問題] Testing with fake classes

作者: Ebergies (火神)   2014-09-02 17:20:36
最近在專案做了一些 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?
作者: jackace (inevitable......)   2014-09-02 18:23:00
ClassBMock都已經繼承B了為什麼不用polymorphism解決要是怕polymorphism會有overhead就用#ifdef 沒TEST的時候B的function不要virtual
作者: firose (guest也是也是也是也是也)   2014-09-02 19:16:00
ClassB 不都換成 ClassBMock 了, 怎麼還會有問題?
作者: Ebergies (火神)   2014-09-02 20:53:00
沒說清楚, CorrectDataInClassB 是 library 的 function因此它不會吃到 define, 其他有使用到 ClassB 的部分的確是像一樓說的由多型解決了但這樣說來的話, 既然 CorrectDataInClassB 不是這個ClassA 的 function, 或許還真的得 fake 它才合理
作者: firose (guest也是也是也是也是也)   2014-09-02 21:14:00
SUT 是 ClassA::CorrectData 其他不相干的應該可以 Fake
作者: jackace (inevitable......)   2014-09-03 00:02:00
只吃vector<ClassB>的lib func是問題所在 你怎麼改都沒用
作者: Ebergies (火神)   2014-09-03 20:17:00
Thanks a lot everyone ~ LOL
作者: Killercat (殺人貓™)   2014-09-05 12:33:00
mocking請靠繼承 不要用template耍花招 會有問題 :P
作者: rifiz (薩哈拉雅)   2014-09-10 14:03:00
有點疑問 ClassBMock 跟 ClassBFake差別在哪?還有上色不要用藍色 幾乎看不到阿阿阿阿

Links booklink

Contact Us: admin [ a t ] ucptt.com