ez8-co / emock

🐞 下一代C/C++跨平台mock库 (Next generation cross-platform mock library for C/C++)
Apache License 2.0
118 stars 35 forks source link

请问能否mock protected属性的方法? #29

Closed huso1101 closed 2 years ago

huso1101 commented 2 years ago

你好,请教一下,emock是否可以mock 类protected属性函数的方法呢? 我用一个测试类TestClass继承类BaseFoo,然后在TestClass里边是可以访问到BaseFoo的protected方法, 但由于无法对protected的方法取地址所以无法使用EMOCK。 如果有方法取得protected属性的成员函数地址,应该可以解决我的问题。大佬有没有什么建议?

orca-zhang commented 2 years ago

两个方案,一个是在测试用例集里面用

#define protected public

XD,有点脏。

还有一个是用类反射,用字符串函数签名式获取函数地址的方案 https://github.com/ez8-co/emock/blob/865bcda180b9eeecf9e7ca06b022649abf761a58/tests/ut/TestOverloadMethodMocker.h#L106

类似:EMOCK("*::CUT::bar(double)"),但是这个功能未开发完全,目前只能临时尝试使用

这里的函数名支持通配符匹配,*贪婪匹配,?是单字符匹配。

huso1101 commented 2 years ago

HHH,方案一好呀。试了一下把宏定义放到头文件前完美解决,private方法也可以这样用了^_^

#define protected public
#include "FooA.h"

这样完全不修改项目源码的情况可以实现mock 类FooA内所有函数,已经符合我的预期了٩( 'ω' )و 蟹蟹!

方案二这个功能我先留作备用方案啦

orca-zhang commented 2 years ago

👍,反射功能我有空也继续弄完它,: )

huso1101 commented 2 years ago

👍,反射功能我有空也继续弄完它,: ) 加油,刚刚我试急了,函数体写头文件里没问题,函数体写其他文件就有问题了...


// FooA.h
class FooA {
protected:
void GetValue();
};

// FooA.cpp

include "FooA.h"

void FooA::GetValue() { return 0; }

// TestFooA.cpp

define protected public

include "FooA.h"

TEST(TestFooA, test1) {

}


上述写法会出现连接错误,无法解析的外部符号public FooA::GetValue,FooA.cpp里的FooA::GetValue属性是protected的。。看来还得尝试一下反射功能
orca-zhang commented 2 years ago

是的,如果是以动态库的方式引入可能会有“无法解析的外部符号”的错误信息,因为我们告诉他方法是可见的,但是他看不见。