使用GTest & GMock

安装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 的逻辑。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容