安裝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 期待指定函數(shù)調(diào)用次數(shù)以及模擬其返回值
.h文件實現(xiàn)
#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文件實現(xiàn)
#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對象是如何實現(xiàn)的搞莺,上一句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();
}
代理函數(shù)
.h實現(xiàn)
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實現(xiàn)
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "Foo.h"
//對一個已經(jīng)有假冒對象的類時的方法執(zhí)行g(shù)Mock測試
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();
}
調(diào)用DelegateToFake函數(shù)后 Fake_Add::run 被載入掂咒, 之后調(diào)用Mock_Add::run才沧,最終走的都是Fake_Add::run 的邏輯。