帖子:gtest/gmock 简单实例 给出了返回值为内置类型的例子,在实际项目中经常出现返回值为自定义类型的数据对象,当被测试函数的返回值为自定义类型时,如何mock?
简单的例子:
main函数所
// GoogleTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "Bar.h"
#include "MockFoo.h"
#include "BarTest.h"
int main(int argc, char* argv[])
{
testing::GTEST_FLAG(output) = "xml:./Report/";
testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();
return 0;
}
Foo.h文件,定义自定义返回类型,并重载==运算符
#pragma once
class ResultData
{
friend bool operator==(const ResultData& lhs, const ResultData& rhs);
public:
void SetDataValue(int val) { m_data = val; }
private:
int m_data = 100;
bool operator==(ResultData& rhs) {
return this->m_data == rhs.m_data;
}
};
class Foo {
public:
virtual int count() = 0;
virtual ResultData GetResultData() = 0;
};
bool operator==(const ResultData& lhs, const ResultData& rhs)
{
return lhs.m_data == rhs.m_data;
}
文件Bar.h增加返回类型为自定类型对象的待测试函数
#pragma once
#include "Foo.h"
class Bar {
public:
Bar(Foo *foo) : m_foo(foo) {
}
int count() {
return m_foo->count();
}
ResultData GetResultData()
{
return m_foo->GetResultData();
}
private:
Foo *m_foo;
};
文件 MockFoo.h编写mock
#pragma once
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "Foo.h"
class MockFoo : public Foo {
public:
MOCK_METHOD0(count, int());
MOCK_METHOD0(GetResultData, ResultData());
};
文件BarTest.h
#pragma once
#include <gtest/gtest.h>
#include "bar.h"
#include "MockFoo.h"
//定义测试类Bar的固件类BarTest
class BarTest : public::testing::Test
{
protected:
Bar* m_TestImpl;
MockFoo *mockFoo;
void SetUp() override
{
mockFoo = new MockFoo();
m_TestImpl = new Bar(mockFoo);
}
void TearDown() override
{
if (m_TestImpl)
{
delete m_TestImpl;
m_TestImpl = nullptr;
}
}
};
TEST_F(BarTest, count)
{
EXPECT_CALL(*mockFoo, count())
.Times(3)
.WillOnce(testing::Return(3))
.WillOnce(testing::Return(6))
.WillOnce(testing::Return(5));
EXPECT_EQ(m_TestImpl->count(), 3);
EXPECT_EQ(m_TestImpl->count(), 6);
EXPECT_EQ(m_TestImpl->count(), 5);
}
TEST_F(BarTest, GetResultData)
{
ResultData rd;
rd.SetDataValue(100);
ResultData rd_exp;
rd_exp.SetDataValue(100);
EXPECT_CALL(*mockFoo, GetResultData()).Times(1).WillOnce(testing::Return(rd));
EXPECT_EQ(m_TestImpl->GetResultData(), rd_exp);
}