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());
所以我有一个 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());