我需要使用此方法测试一个类(假设它称为Caller):

void Caller::callMe(map<string, string> argument);

该类拥有一个指向另一个类的指针(比如Executor),该类具有以下方法:
void Executor::addVector(vector< shared_ptr<AbstractClass> > aVector);

我想测试一下,当调用Caller::callMe()时,它使用map<string>参数创建了ConcreteClass对象(AbstractClass接口(interface)的实现),创建了vector< shared_ptr<ConcreteClass> >对象,并传递给Executor::addVector()

为此,我创建了一个MockExecutor,例如:
MOCK_METHOD1( addVector, void(vector<shared_ptr<AbstractClass> >) );

并将其传递给我的Caller实例。
Caller::callMe()方法从我正在传递的 map 中得出vector< shared_ptr<ConcreteClass> >,即在调用Caller::callMe()之前预先不知道 vector 的值。

这意味着,为了测试 vector 中的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。期望并不完全漂亮,但我认为它将满足您的要求。

关于c++ - 比较googlemock中的指针的cointainer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31513885/

10-11 16:12