比较 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 项指向 的值 ,同时处理来自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。期望值不是很理想,但我认为它会做你想做的事。