我需要用这个方法测试一个类(假设它名为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写这样的测试呢?或者,使用自定义匹配器可以实现这一点吗?
谢谢!
发布于 2015-07-21 22:26:01
可能有几种不同的方法可以做到这一点,但我首先想到的是使用自定义匹配器。假设上面的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))))));这个期望不是很好,但我想它能做你想做的事。
https://stackoverflow.com/questions/31513885
复制相似问题