Gmock 如何模拟一个不带参数的单行函数?

Gmock how to mock a one line function which doesn't take parameters?

所以我有一个 class 从其他 class 调用方法,但最终它会 return 一个字符串左右

这是我的class:Person.cpp

Person::Person(){}
std::string Person::getName(void) {
    return namespaceX::namespaceY::StringVal;
}

这是我的模拟/测试class:

class MockPerson : public Person{
public:
    typedef ::testing::StrictMock<Person> Strict;
    MockPerson() : Person(){}
    ~MockPerson() override = default;

    MOCK_METHOD0(getName, std::string ());
    std::string callFunc(){
        return Person::getName();
}

这是我的测试头文件:

class PersonTest : public testing::Test {
public:
    PersonTest () :
            mock(std::make_shared<MockPerson ::Strict>()){}
    ~PersonTest (void) override = default;

    std::shared_ptr<MockPerson ::Strict> mock;
};

这是我的测试:

#include "testHeader.hpp"
TEST_F(PersonTest , case1)
{
    EXPECT_CALL(*mock, getName());
    ASSERT_EQ(someString, mock->callFunc());
}

测试设置对我来说看起来不错,但是当我 运行 测试时,它给了我:

Actual function call count doesn't match EXPECT_CALL(*mock, getName())...
         Expected: to be called once
           Actual: never called - unsatisfied and active

而 ASSERT 语句中的值 return 只是字符串 ("") 的 默认值

有什么办法可以通过吗?我在网上看到我们应该将一个实际对象传递给函数,但在这种情况下,一个非常简单的函数比复杂的函数引起更多的麻烦。感谢任何帮助。

首先,使用 g++ 编译您的示例会出现以下错误:

error: 'using element_type = class testing::StrictMock<Person>' {aka 'class testing::StrictMock<Person>'} has no member named 'gmock_getName'

这可以通过传递 MockPerson 作为 StrictMock 的模板参数来解决,而不是传递 Person:

 typedef ::testing::StrictMock<MockPerson> Strict;

其次,您的 callFunc 声明显式调用了 Person class 的 getName 函数。这绕过了 getName 的模拟版本,因此绕过了 Google Mock 插入以跟踪函数调用次数的检测。因此,您得到关于函数调用计数不匹配的断言失败。这可以通过 callFunc 调用当前 class (MockPerson) 的 getName 来解决:

  std::string callFunc() { return getName(); }

第三,mocked getName 将 return 默认构造 std::string,因此你得到 ""。您可以通过在 PersonTest 构造函数中添加此声明来更改属于 PersonTest 的所有测试的行为:

ON_CALL(*mock, getName()).WillByDefault(Return("xyz"));

或者您可以通过将 EXPECT_CALL 声明修改为:

来设置单个测试的行为
EXPECT_CALL(*mock, getName()).WillRepeatedly(Return("xyz"));

对于这两种变体,callFunc 的断言应该会按预期工作:

ASSERT_EQ("xyz", mock->callFunc());