Gmock - 匹配结构

新手上路,请多包涵

如何为输入参数匹配联合中元素的值,例如 - 如果我模拟具有以下签名的方法 -

     struct SomeStruct
    {
        int data1;
        int data2;
    };

    void SomeMethod(SomeStruct data);

如何匹配该方法的模拟在参数中使用正确的值调用?

原文由 NiladriBose 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 683
2 个回答

在详细阅读了 Google 模拟文档之后,我解决了 定义匹配器 部分中记录的问题。 (一个例子会很棒!)

因此解决方案是使用 MATCHER_P 宏来定义自定义匹配器。所以对于匹配 SomeStruct.data1 我定义了一个匹配器:

 MATCHER_P(data1AreEqual, ,"") { return (arg.data1 == SomeStructToCompare.data1); }

为了符合预期,我使用了这个自定义宏,如下所示:

 EXPECT_CALL(someMock, SomeMethod(data1AreEqual(expectedSomeStruct)));

这里, expectedSomeStruct 是我们期望的 structure.data1 的值。

请注意,正如其他答案(在这篇文章和其他文章中)所建议的那样,它需要被测单元进行更改以使其可测试。那不应该是必要的!例如超载。

原文由 NiladriBose 发布,翻译遵循 CC BY-SA 4.0 许可协议

也许没用,因为很久以前就已经回答了这个问题,但这里有一个适用于任何结构且不使用 MATCHER 或 FIELD 的解决方案。

假设我们正在检查:methodName(const Foo& foo):

 using ::testing::_;

struct Foo {
    ...
    ...
};

EXPECT_CALL(mockObject, methodName(_))
    .WillOnce([&expectedFoo](const Foo& foo) {
        // Here, gtest macros can be used to test struct Foo's members
        // one by one for example (ASSERT_TRUE, ASSERT_EQ, ...)
        ASSERT_EQ(foo.arg1, expectedFoo.arg1);
    });

原文由 BWD 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏