Gmock - 匹配结构

时间:2014-05-29 16:30:49

标签: c++ gmock

如何为输入参数匹配union中元素的值,例如 - 如果我使用以下符号模拟方法 -

    struct SomeStruct
    {   
        int data1;
        int data2; 
    };

    void SomeMethod(SomeStruct data);

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

4 个答案:

答案 0 :(得分:15)

详细阅读了Google模拟文档后,我解决了Defining Matchers部分中记录的问题。 (一个例子会很棒!)

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

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

在期望中匹配它我像这样使用这个自定义宏:

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

此处,expectedSomeStruct是我们期待的structure.data1的值。

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

答案 1 :(得分:6)

Google提供了一些关于使用gmock的完整文档,其中包含示例代码。我强烈建议您查看它:

https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md#using-matchers

正如您所指出的,不会为类类型(包括POD)自动创建默认的相等运算符(==)。由于gmock在匹配参数时使用此运算符,因此您需要显式定义它以便像使用任何其他类型一样使用该类型(如下所示):

    // Assumes `SomeMethod` is mocked in `MockedObject`
    MockedObject foo;
    SomeStruct expectedValue { 1, 2 };

    EXPECT_CALL(foo, SomeMethod(expectedValue));

因此,最直接的处理方法是为结构定义一个等于运算符:

struct SomeStruct
{   
    int data1;
    int data2; 

    bool operator==(const SomeStruct& rhs) const
    {
        return data1 == rhs.data1
            && data2 == rhs.data2;
    }
};

如果您不想走这条路线,可以考虑使用the Field matcher根据其成员变量的值匹配参数。 (如果测试有兴趣比较结构实例之间的相等性,那么它很好地表明其他代码也会感兴趣。因此,定义{{1}可能是值得的。并完成它。)

答案 2 :(得分:2)

也许这个问题很久以前就没有用了,但这是一种适用于任何结构且不使用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);
    });

答案 3 :(得分:0)

上面已基本回答了这个问题,但我想再举一个例子:

let data = [{
    "title": "CAP Pâtissier à La Ciotat - GRETA Marseille Méditerranée - Académie ...",
    "url": "https://www.gretanet.com/formation-cap-patissier+la-ciotat+1007.html",
    "displayedUrl": "https://www.gretanet.com/formation-cap-patissier+la-ciotat+1007.html",
    "description": "Formation CAP Pâtissier à La Ciotat - GRETA Marseille Méditerranée - Académie d'Aix-Marseille.",
    "siteLinks": []
  },
  {
    "title": "Les sujets du CAP pâtissier - EISF",
    "url": "https://www.eisf.fr/sujets-examen-cap-patisserie/",
    "displayedUrl": "https://www.eisf.fr/sujets-examen-cap-patisserie/",
    "description": "8 déc. 2018 - Vous voulez vous entrainer à l'examen du CAP Pâtissier ? Retrouver les annales des années précédentes. Sujets CAP Pâtissier 2018.",
    "siteLinks": []
  }
];

let indexArr = [];
data.forEach(function(item, index) {
  if (item.url.indexOf('eisf') !== -1) {
    indexArr.push(index);
  }
});

console.log(indexArr)