首页 > 解决方案 > 使用 gmock 编写单元测试

问题描述

考虑如下情况

class A
{
   public:
      bool Init()
      {
         bool ret = false;
         /* code */
         return ret;
      }
};

A a_obj;

class B
{
   public:
      bool Foo()
      { 
         if(a_obj.Init())
         {
            cout<< "X" ;
         }
         else
         {
            cout<< "Y" ;
         }
      }
}

class MockA
{
   public:
      METHOD0(Init, bool());
};

TEST(InitTest, CallFoo)
{
MockA mockobj;
B b_obj;
/* ???*/
}

我想写2个单元测试用例,用mock模拟Init的返回值

  1. Init 的返回值为真,打印 X
  2. Init 的返回值为 false,打印 Y。

我不想将 A 对象保留为 B 的成员,我想将其保留为全局变量。我该如何编写这些测试?

标签: googletestgooglemock

解决方案


A不必是成员B- 它可以作为参数传递给 Foo()witha_obj作为默认值:

// A definition as before
A a_obj;

class B
{
   public:
      bool Foo(A& a = a_obj)
      { 
         if(a.Init())
         {
            cout<< "X" ;
         }
         else
         {
            cout<< "Y" ;
         }
      }
}

但是您必须创建Init一个虚拟方法(并且很可能将虚拟 dtor 添加到 A),然后MockA派生自A或使用高性能DI,并根据模板创建Foo一个模板方法或整个类B


推荐阅读