简介

  • gmock库笔记

C++ gmock是什么

Google Mock(gmock)是Google开发的C++的一个模拟对象库,用于进行单元测试时生成模拟(mock)对象。Google Mock结合Google Test(gtest),可以帮助开发人员进行单元测试,特别是在涉及到依赖对象(如外部库、接口等)的情况下。

以下是对 gmock 的主要特点和用法的简要说明:

主要特点:

  1. 模拟对象: gmock 允许你创建模拟对象,这些对象可以替代真实的对象,用于测试代码的各个部分。

  2. 期望与行为: 你可以设置对模拟对象的期望,定义它应该如何被调用以及返回什么值。这允许你测试被测试对象与其依赖关系的交互。

  3. 模拟方法: 通过使用 ON_CALL 宏,你可以为模拟对象的方法设置行为,使其在调用时返回指定的值。

  4. 参数匹配: gmock 提供了多种参数匹配器,以灵活匹配模拟对象方法的参数。

  5. 死亡测试(Death Tests): 可以使用 EXPECT_DEATHASSERT_DEATH 宏测试代码是否导致了程序的异常退出。

使用方法:

  1. 包含头文件: 在测试文件中,首先包含 gmock/gmock.h 头文件:

    1
    
     #include <gmock/gmock.h>
    
  2. 定义模拟对象: 使用 MOCK_METHOD 宏定义一个模拟对象的方法。例如:

    1
    2
    3
    4
    
     class MockClass {
     public:
         MOCK_METHOD(int, MyMethod, (int, double));
     };
    
  3. 设置期望: 在测试用例中使用 gmock 的宏来设置对模拟对象的期望。例如:

    1
    2
    3
    
     MockClass mockObj;
     EXPECT_CALL(mockObj, MyMethod(42, _))
         .WillOnce(Return(3));
    
  4. 运行测试: 在主函数中调用 ::testing::InitGoogleMock 初始化 gmock,并运行所有测试用例:

    1
    2
    3
    4
    
     int main(int argc, char** argv) {
         ::testing::InitGoogleMock(&argc, argv);
         return RUN_ALL_TESTS();
     }
    
  5. 使用模拟对象: 在测试代码中使用模拟对象:

    1
    2
    
     MockClass mockObj;
     // 使用 mockObj,调用 MyMethod(42, 3.14) 将返回 3
    

示例:

下面是一个简单的示例,演示如何使用 gmock 进行单元测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <gmock/gmock.h>

class MyInterface {
public:
    virtual int GetValue() const = 0;
};

class MockMyInterface : public MyInterface {
public:
    MOCK_METHOD(int, GetValue, (), (const, override));
};

TEST(MyTestSuite, TestName) {
    MockMyInterface mockObj;
    EXPECT_CALL(mockObj, GetValue())
        .WillOnce(::testing::Return(42));

    int result = mockObj.GetValue();
    ASSERT_EQ(result, 42);
}

在这个示例中,MockMyInterfaceMyInterface 的模拟类,通过设置 EXPECT_CALL 宏来设置对 GetValue 方法的期望。在测试中,调用 mockObj.GetValue() 将返回预期的值。这使得我们能够独立地测试代码,而不依赖于真实的 MyInterface 实现。

C++ gmock库 详解

Google Mock(gmock)是Google Test框架的一部分,是一个用于C++的模拟对象库,用于进行单元测试。以下是对 gmock 库的一些详解:

主要特性:

  1. 模拟类和接口: gmock 允许你创建模拟类和接口,以替代真实的实现,并且模拟对象的行为是可控制的。

  2. 定义模拟方法: 使用 MOCK_METHOD 宏可以在模拟类或接口中定义虚拟方法,表示该方法是一个模拟方法。

    1
    2
    3
    4
    
     class MyInterface {
     public:
         virtual void DoSomething() = 0;
     };
    
  3. 设置模拟方法的行为: 使用 EXPECT_CALL 宏来设置对模拟方法的期望。可以指定方法的调用次数、返回值、抛出异常等。

    1
    2
    3
    4
    5
    
     MockMyInterface mock;
     EXPECT_CALL(mock, DoSomething())
         .Times(2)
         .WillOnce(Return(42))
         .WillOnce(Throw(std::runtime_error("Error")));
    
  4. 参数匹配: gmock 提供了参数匹配器,可以灵活地匹配模拟方法的输入参数。

    1
    
     EXPECT_CALL(mock, SomeMethod(NotNull(), _, 5));
    
  5. 委托模拟方法的行为: 使用 WillByDefault 宏可以指定模拟方法的默认行为。

    1
    2
    
     ON_CALL(mock, SomeMethod(_))
         .WillByDefault(Invoke(&real_object, &RealObject::SomeMethod));
    

使用方法:

  1. 包含头文件: 在测试文件中,首先包含 gmock/gmock.h 头文件:

    1
    
     #include <gmock/gmock.h>
    
  2. 定义模拟类或接口: 使用 MOCK_METHOD 宏在模拟类或接口中定义虚拟方法。

    1
    2
    3
    4
    
     class MyInterface {
     public:
         virtual void DoSomething() = 0;
     };
    
  3. 设置期望: 在测试用例中使用 EXPECT_CALL 宏设置对模拟方法的期望。

    1
    2
    3
    4
    5
    
     MockMyInterface mock;
     EXPECT_CALL(mock, DoSomething())
         .Times(2)
         .WillOnce(Return(42))
         .WillOnce(Throw(std::runtime_error("Error")));
    
  4. 运行测试: 在主函数中调用 ::testing::InitGoogleMock 初始化 gmock,并运行所有测试用例。

    1
    2
    3
    4
    
     int main(int argc, char** argv) {
         ::testing::InitGoogleMock(&argc, argv);
         return RUN_ALL_TESTS();
     }
    

示例:

下面是一个简单的示例,演示了如何使用 gmock 进行单元测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <gmock/gmock.h>

class MyInterface {
public:
    virtual int GetValue() const = 0;
};

class MockMyInterface : public MyInterface {
public:
    MOCK_METHOD(int, GetValue, (), (const, override));
};

TEST(MyTestSuite, TestName) {
    MockMyInterface mockObj;
    EXPECT_CALL(mockObj, GetValue())
        .WillOnce(::testing::Return(42));

    int result = mockObj.GetValue();
    ASSERT_EQ(result, 42);
}

在这个示例中,MockMyInterfaceMyInterface 的模拟类,通过设置 EXPECT_CALL 宏来设置对 GetValue 方法的期望。在测试中,调用 mockObj.GetValue() 将返回预期的值。这使得我们能够独立地测试代码,而不依赖于真实的 MyInterface 实现。