比较googlemock中指针的容器

Comparing cointainers of pointers in googlemock

本文关键字:指针 googlemock 比较      更新时间:2023-10-16

我需要用这个方法测试一个类(假设它叫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项目,也处理从AbstractClassConcreteClass的转换。

我读到有可能使用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。期望不是很好,但我认为它会达到你的目的。