c++ - 使用 Google Test 检查类方法的调用

标签 c++ googletest

使用谷歌测试,如果我调用另一个类方法,我想检查是否调用了一些类方法。

#include "gtest/gtest.h"

class Foo {

    void DoWorkPrivate(int i) {}

public:

    void DoWork(int i) {}

    void Run() {
        for (int i = 1; i <= 5; i++) {
            DoWork(i);
            DoWorkPrivate(i);
        }
    }
};

TEST(FooTest, Run) {
    Foo foo;    
    foo.Run(); // Need to check that DoWork() and DoWorkPrivate() are invoked
}

问题:

如何检查 DoWork()DoWorkPrivate() 是否使用某些参数(1、2、3、4、5)被调用了 5 次?

最佳答案

在这种情况下,通常的方法是创建一个 Mock-Object。有很多关于模拟和不同类型模拟的文献和文章。所以我不会在这里深入细节。例如fowler about mocking .

但通常您可以子类化类(或者通常是类的接口(interface)),您期望方法调用。

这意味着你的例子:

class FooMock : public Foo {
  public:
  bool isDoWorkPrivateCalled() {
    return isDoWorkPrivatecall;
  }

  private:
  DoWorkPrivate(int i) { isDoWorkPrivatecall = true;}
  bool isDoWorkPrivatecall = false;
}


TEST(FooTest, Run) {
  Foo *foo = new FooMocK();    
  foo->Run();
  EXPECT_TRUE(foo->isDoWorkPrivateCalled());
}

是的,这意味着必须保护私有(private)方法。

至少我建议使用gmock .模拟框架使用模拟功能扩展了 gtest。使用 gmock 你可以模拟一个方法

MOCK_METHOD1(DoWorkPrivate, void(int i));

然后在您的特定情况下,测试将如下所示:

EXPECT_CALL(foo, DoWorkPrivate(1)).Times(1);
EXPECT_CALL(foo, DoWorkPrivate(2)).Times(1);
EXPECT_CALL(foo, DoWorkPrivate(3)).Times(1);
EXPECT_CALL(foo, DoWorkPrivate(4)).Times(1);
EXPECT_CALL(foo, DoWorkPrivate(5)).Times(1);

关于c++ - 使用 Google Test 检查类方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42712372/

相关文章:

c++ - OpenGL:从 Visual Studio 源代码到 XCode 4?

时间:2019-03-09 标签:c++directxmulititextures

c++ - 在 CLion 中设置 Google 测试

c++ - 使用 CMake 构建 Google Test

c++ - 对于单元测试,是否有一种骇人听闻的方法来更改 const 变量的值?

c++ - GTEST : Identify before and after a SetUp and TearDown respectively

c++ - 在 MSVC 中压缩后可能发生数据损坏? (C++)

c++ - C++代码执行过程中如何连接dll文件?

十进制转十六进制的C++程序

c++ - 使用 googletest 一次为多个测试模块运行单元测试