比较googlemock中指针的容器
Comparing cointainers of pointers in googlemock
我需要用这个方法测试一个类(假设它叫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中编写这样的测试?或者,是否有可能使用自定义匹配器实现这一点?
谢谢!
[1] https://code.google.com/p/googlemock/wiki/CookBook Validating_the_Value_Pointed_to_by_a_Pointer_Argument
[2] https://code.google.com/p/googlemock/wiki/V1_7_CookBook Casting_Matchers
可能有几种不同的方法可以做到这一点,但我想到的第一件事是使用自定义匹配器。假设上面的ConcreteClass看起来像这样:
class ConcreteClass : public AbstractClass {
public:
unsigned value;
};
你可以写一个自定义匹配器来处理向下转换:
MATCHER_P(DownCastClassHasValue, value, "") {
return reinterpret_cast<const ConcreteClass*>(&arg)->value == value;
}
可以这样使用:
EXPECT_CALL( *mockExecutor, addVector(AllOf(
Contains(Pointee(DownCastClassHasValue(1))),
Contains(Pointee(DownCastClassHasValue(2))))));
, c。期望不是很好,但我认为它会达到你的目的。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 比较googlemock中指针的容器