[问题] 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