安装Gtest & Gmock
git clone https://github.com/google/googletest.git
cd googletest
mkdir build && cd build/
cmake ..
make -j
sudo make install
编译命令:g++ main.cpp -pthread -lgtest -lgmock
使用 EXPECT_CALL 期待指定函数调用次数以及模拟其返回值
.h文件实现
#include <gmock/gmock.h>
class Calculation
{
public:
virtual int run(const int& n1, const int& n2) = 0;
};
class Mock_Add : public Calculation
{
public:
MOCK_METHOD(int, run, (const int&, const int&), (override));
};
class Mock_Sub : public Calculation
{
public:
MOCK_METHOD(int, run, (const int&, const int&), (override));
};
class Mock_Mult : public Calculation
{
public:
MOCK_METHOD(int, run, (const int&, const int&), (override));
};
class Mock_Div : public Calculation
{
public:
MOCK_METHOD(int, run, (const int&, const int&), (override));
};
class Calculator
{
public:
void setWorker(Calculation* w)
{
worker = w;
}
int run(const int& n1, const int& n2)
{
if(worker)
{
return worker->run(n1, n2);
}
else
{
return 0;
}
}
Calculation* worker = nullptr;
};
main文件实现
#include <iostream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "Foo.h"
TEST(CalTest, Test1)
{
Calculator worker;
Mock_Add add;
Mock_Sub sub;
Mock_Mult mult;
Mock_Div div;
EXPECT_EQ(worker.run(1, 2), 0);
worker.setWorker(&add);
EXPECT_CALL(add, run(::testing::_, ::testing::_)).WillOnce(::testing::Return(1));
EXPECT_EQ(worker.run(1, 2), 1);//如论Add对象是如何实现的,上一句Return返回了1,所以这里只会返回1
worker.setWorker(&sub);
EXPECT_CALL(sub, run(::testing::_, ::testing::_)).WillOnce(::testing::Return(2));
EXPECT_EQ(worker.run(1, 2), 2);
worker.setWorker(&mult);
EXPECT_CALL(mult, run(::testing::_, ::testing::_)).WillOnce(::testing::Return(3));
EXPECT_EQ(worker.run(1, 2), 3);
worker.setWorker(&div);
EXPECT_CALL(div, run(::testing::_, ::testing::_)).WillOnce(::testing::Return(4));
EXPECT_EQ(worker.run(1, 2), 4);
}
int main(int argc, char *argv[]) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
代理函数
.h实现
class Calculation
{
public:
virtual int run(const int& n1, const int& n2) = 0;
};
class Fake_Add : public Calculation
{
public:
int run(const int& n1, const int& n2)
{
return n1 + n2;
}
};
class Mock_Add : public Calculation
{
public:
MOCK_METHOD(int, run, (const int&, const int&), (override));
void DelegateToFake()
{
ON_CALL(*this, run).WillByDefault([this](const int& n1, const int& n2){
return fake.run(n1, n2);
});
}
private:
Fake_Add fake;
};
.cpp实现
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "Foo.h"
//对一个已经有假冒对象的类时的方法执行gMock测试
TEST(AbcTest, DelegateToFake)
{
Mock_Add mock;
mock.DelegateToFake();
EXPECT_CALL(mock, run(::testing::_, ::testing::_));
EXPECT_EQ(3, mock.run(1, 2));
}
int main(int argc, char *argv[]) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
调用DelegateToFake函数后 Fake_Add::run 被载入, 之后调用Mock_Add::run,最终走的都是Fake_Add::run 的逻辑。