【问题标题】:Comparing cointainers of pointers in googlemock比较googlemock中指针的硬币容器
【发布时间】:2015-07-20 10:13:23
【问题描述】:

我需要用这个方法测试一个类(假设它叫Caller):

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

那个类拥有一个指向另一个类的指针(比如说Executor),它有这个方法:

void Executor::addVector(vector< shared_ptr<AbstractClass> > aVector);

我想测试一下,当调用Caller::callMe() 时,它使用map&lt;string&gt; 参数创建一个ConcreteClass 对象(AbstractClass 接口的实现),创建一个vector&lt; shared_ptr&lt;ConcreteClass&gt; &gt; 对象并通过到Executor::addVector()

为此,我创建了一个MockExecutor,例如:

MOCK_METHOD1( addVector, void(vector<shared_ptr<AbstractClass> >) );

并将其传递给我的 Caller 实例。

Caller::callMe() 方法从我传递的地图中派生出vector&lt; shared_ptr&lt;ConcreteClass&gt; &gt;,即在调用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

【问题讨论】:

  • 看看,如果这篇文章有助于解决你的问题:stackoverflow.com/questions/7616475/…
  • 谢谢,但这似乎并没有解决我的问题,或者至少我看不出如何将它应用于我的情况。实际上我意识到我需要更具体一些,所以我编辑了我的问题,添加了更多细节。

标签: c++ stl containers googletest googlemock


【解决方案1】:

可能有几种不同的方法可以做到这一点,但我首先想到的是使用自定义匹配器。假设上面的 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。期望并不完全漂亮,但我认为它会如你所愿。

【讨论】:

  • 谢谢你,完成了这项工作:)
猜你喜欢
  • 2017-01-19
  • 2016-03-20
  • 1970-01-01
  • 2012-07-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多