如何使用gmock测试类是否调用它';s基类';方法 我刚刚开始使用C++和单元测试,我有一些类似于上面的代码,我想使用GMOCK来测试超Fo::UpDebug()/Cub>调用基类' MOVER()>代码>方法。攻击这种情况的最佳方法是什么?

如何使用gmock测试类是否调用它';s基类';方法 我刚刚开始使用C++和单元测试,我有一些类似于上面的代码,我想使用GMOCK来测试超Fo::UpDebug()/Cub>调用基类' MOVER()>代码>方法。攻击这种情况的最佳方法是什么?,c++,googletest,gmock,C++,Googletest,Gmock,一种方法是将move方法虚拟化,并创建类的模拟: class Foo { public: int x; int y; void move(void); }; class SuperFoo: public Foo { public: int age; void update(); }; SuperFoo::update(void) { move(); age++; } 然后在测试中,设置相应的呼叫期望 #include "gtest

一种方法是将
move
方法虚拟化,并创建类的模拟:

class Foo {
public:
    int x;
    int y;

    void move(void);
};

class SuperFoo: public Foo {
public:
    int age;

    void update();
};

SuperFoo::update(void) {
    move();
    age++;
}
然后在测试中,设置相应的呼叫期望

#include "gtest/gtest.h"
#include "gmock/gmock.h"

class Foo {
public:
    int x;
    int y;

    virtual void move(void);
    //^^^^ following works for virtual methods
};
// ...

class TestableSuperFoo : public SuperFoo
{
public:
  TestableSuperFoo();

  MOCK_METHOD0(move, void ());

  void doMove()
  {
    SuperFoo::move();
  }
};

我不知道gmock,但你为什么要测试它?您测试的是方法的输入/输出,而不是它内部的工作方式!如果您在特定的子类情况下找到更好的方法来做某事,那么您不需要调用super。。。否则,只需在程序使用的基类上添加一个非虚方法,该类调用派生类中定义的虚方法(或使用CRTP的类似方法)。我没有在测试
move()
方法的行为之后,我已经在
Foo
的测试套件中对其进行了单元测试,为
SuperFoo
再做一遍似乎是不必要的重复劳动。就
SuperFoo
而言,我所关心的是
move()
方法实际上是在正确的位置使用的。很好,这就成功了。谢谢,一旦我被允许,我会投票的!
TEST(SuperFoo, TestUpdate)
{
  TestableSuperFoo instance;

  // Setup expectations:
  // 1) number of times (Times(AtLeast(1)), or Times(1), or ...
  // 2) behavior: calling base class "move" (not just mock's) if "move" 
  //    has side-effects required by "update"
  EXPECT_CALL(instance, move()).Times(testing::AtLeast(1))
    .WillRepeatedly(testing::InvokeWithoutArgs(&instance, &TestableSuperFoo::doMove));

  const int someValue = 42;
  instance.age = someValue;
  // Act
  instance.update();
  // Assert
  EXPECT_EQ(someValue+1, instance.age);
}