gpt4 book ai didi

c++ - Gmock如何模拟不带参数的单行函数?

转载 作者:行者123 更新时间:2023-12-02 10:29:17 27 4
gpt4 key购买 nike

所以我有一个从其他类调用方法的类,但是最终它将返回一个字符串

这是我的类(class):Person.cpp

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

这是我的模拟/测试课:
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语句中返回的值只是字符串(“”)的 默认值
有办法解决吗?我在网上看到我们应该将实际对象传递给该函数,但是在这种情况下,一个非常简单的函数会比复杂的函数引起更多的麻烦,请多多帮助:)

最佳答案

首先,使用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的声明显式调用了 getName类的 Person函数。这会绕过 getName的模拟版本,因此会绕过Google Mock插入的工具以跟踪函数调用的数量。因此,您会得到有关函数调用计数不匹配的断言失败。可以通过让 callFunc调用当前类的 getName( MockPerson)来解决此问题:
  std::string callFunc() { return getName(); }
第三,模拟的 getName将返回默认构造的 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());

关于c++ - Gmock如何模拟不带参数的单行函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62963984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com