比较 googlemock 中指针的容器
Comparing cointainers of pointers in googlemock
我需要用这个方法测试一个 class(假设它叫做 Caller
):
void Caller::callMe(map<string, string> argument);
那个 class 持有一个指向另一个 class(比方说 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()
.[=36 之前事先不知道向量的值=]
这意味着,为了测试向量中的 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
可能有几种不同的方法可以做到这一点,但我首先想到的是使用自定义匹配器。假设上面的 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。期望值不是很理想,但我认为它会做你想做的事。
我需要用这个方法测试一个 class(假设它叫做 Caller
):
void Caller::callMe(map<string, string> argument);
那个 class 持有一个指向另一个 class(比方说 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()
.[=36 之前事先不知道向量的值=]
这意味着,为了测试向量中的 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
可能有几种不同的方法可以做到这一点,但我首先想到的是使用自定义匹配器。假设上面的 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。期望值不是很理想,但我认为它会做你想做的事。