【发布时间】:2015-07-20 10:13:23
【问题描述】:
我需要用这个方法测试一个类(假设它叫Caller):
void Caller::callMe(map<string, string> argument);
那个类拥有一个指向另一个类的指针(比如说Executor),它有这个方法:
void Executor::addVector(vector< shared_ptr<AbstractClass> > aVector);
我想测试一下,当调用Caller::callMe() 时,它使用map<string> 参数创建一个ConcreteClass 对象(AbstractClass 接口的实现),创建一个vector< shared_ptr<ConcreteClass> > 对象并通过到Executor::addVector()。
为此,我创建了一个MockExecutor,例如:
MOCK_METHOD1( addVector, void(vector<shared_ptr<AbstractClass> >) );
并将其传递给我的 Caller 实例。
Caller::callMe() 方法从我传递的地图中派生出vector< shared_ptr<ConcreteClass> >,即在调用Caller::callMe() 之前,向量的值是事先未知的。
这意味着,为了测试向量中的ConcreteClass 项是否与预期值匹配,我不能这样做:
vector< shared_ptr<ConcreteClass> > expectedVector;
for(size_t i = 0; i < expectedLength; ++i)
{ /* initialise vector with expected values */ }
EXPECT_CALL( *mockExecutor, addVector(expectedVector) );
或
EXPECT_CALL( *mockExecutor, addVector(ElementsAre(..., ...) );
因为shared_ptr 项目会有所不同,我实际上需要比较shared_ptr 项目指向 的值,还要处理从AbstractClass 到ConcreteClass 的转换。
我已经读到可以使用Pointee() [1] 比较 googlemock 中指向的值,并且可以使用SafeMatcherCast() [2] 进行类型转换,但我在制作整个工作。
如何在 googlemock 中编写这样的测试?或者,是否可以使用自定义匹配器来实现?
谢谢!
[2]https://code.google.com/p/googlemock/wiki/V1_7_CookBook#Casting_Matchers
【问题讨论】:
-
看看,如果这篇文章有助于解决你的问题:stackoverflow.com/questions/7616475/…
-
谢谢,但这似乎并没有解决我的问题,或者至少我看不出如何将它应用于我的情况。实际上我意识到我需要更具体一些,所以我编辑了我的问题,添加了更多细节。
标签: c++ stl containers googletest googlemock