如何在构造函数中设置函数调用的期望值?

How to set expectation on the function calls inside the constructor?

我正在使用 google test(gtest/gmock) 为程序 (C++) 添加几个测试。对于其中一个 class,我必须添加一个测试以确保 class 在其构造函数中调用一个函数(假设是一个我不想错过的重要函数)。

例如:

class foo
{
    foo()
    {
        bar();
    }
};

在这里,我需要添加一个测试以确保 bar() 在 foo 实例化中被调用。由于期望应该在动作之前添加,所以我发现很难添加这样的测试:

例如:

foo f; // here the bar is called, so we need to set expectation before it but we got the object at this moment only

我想用 EXPECT_CALL() 来完成这个任务。我是 google 测试的新手。让我知道我是否想清楚了,这里需要做什么?

更新:bar()fooclass的继承成员函数。我需要测试在进一步的变化中永远不会错过那个电话。该测试将确保调用始终存在,即使在对源代码进行了几次新修改之后也是如此。

通常你会测试一个 class(没有模拟)并模拟那个 class 的合作者(即与之交互的 classes)。正在测试的 class 不应同时被模拟。

但是,在您的用例中,您似乎正在尝试同时测试 class 和模拟相同的 class(或父 class)。 如果您想测试构造函数中是否调用了某些东西,我认为您不能特别使用 GMock 来执行此操作,因为 EXPECT_CALL 需要模拟 class 的对象,并且在您创建该对象时,构造函数被调用并完成。因此,您需要明确区分被模拟的 class-under-test 和合作者 class。

有趣的是,如果您尝试这样做 here you will get a warning for an uninteresting call to bar,这是 bar 被调用的标志,但它不是那么有用,因为当您收到警告时,您的测试将失败。

相反,我建议您创建并测试 bar() 的副作用,而不是使用模拟和 EXPECT_CALL。为此,您必须稍微修改 class 定义。例如,你可以这样写:

class base {
   void bar(){
      //...
      bar_was_called = true;
   }
 public:
   bool bar_was_called=false;
};

class foo : public base
{
  public:
    foo()
    {
        bar();
    }
};

TEST(foo, barWasCalled){
  foo f;
  EXPECT_TRUE(f.bar_was_called);
}