单元测试时嘲弄成员函数 C++类 gtestgmock

问题描述 投票:0回答:1

我有以下的类(这是实际类的一个非常简化的版本。

class PostCalc
{
public:
    virtual int add(int a, int b) { return a+b; } // Actual function is complex
    virtual int multiply(int a, int b) { return a*b; } // So this one
    virtual int multiop(int a, int b) { return add(a, b) + multiply(a, b); } 
};

例如,如果我想对以下类进行单元测试 multiop() 并模拟其他成员函数[。add()multiply() ],我们如何才能实现呢?我想创建PostCalc的模拟类,gmocked add()multiply() 并创建了一个委托函数,用于 multiop().

  class PostCalcMock : public PostCalc                            
  {                                                                               
  public:                                                                            
      MOCK_METHOD2(add, int(int a, int b)); 
      MOCK_METHOD2(multiply, int(int a, int b));       

      // Delegate                                                            
      int delegateToMultiOp(int a, int b) { 
          return multiop(a, b);
      }                                                                           
  };

这样的处理方式好吗?希望得到任何帮助。

先谢谢你了。

c++ googletest googlemock
1个回答
1
投票

你不需要 delegateToMultiOp. 总是专注于测试你想要的公共行为。我在这里可以看出,你的意图是,每当有人呼叫 multiop,其结果是 addmultiply 将被称为。

namespace {
class PostCalc {
  public:
  virtual int add(int a, int b) { return a + b; }  // Actual function is complex
  virtual int multiply(int a, int b) { return a * b; }  // So this one
  virtual int multiop(int a, int b) { return add(a, b) + multiply(a, b); }
};

class PostCalcMock : public PostCalc {
  public:
  MOCK_METHOD2(add, int(int a, int b));
  MOCK_METHOD2(multiply, int(int a, int b));
};
struct MultipleOperationsTest : public testing::Test {};
}  // namespace

TEST_F(MultipleOperationsTest, ExpectsToConfirmThatAddAndMultiplyIsCalled) {
  PostCalcMock mock;
  int a = 2, b = 3;
  EXPECT_CALL(mock, add(a, b));
  EXPECT_CALL(mock, multiply(a, b));
  mock.multiop(a, b);
}
© www.soinside.com 2019 - 2024. All rights reserved.