C++ 测试私有(private)回调方法

标签 c++ testing callback googletest

我有一个类,它向其他类注册自己的私有(private)方法以用作回调。这利用 std::bind 创建一个指向私有(private)方法的 std::function

示例:(名称不是实际的类名)

class DataProcessor {
private:
    void callback() {
        // Do something
    };
public:
    DataProcessor(IDataSupplier* supplier) {
        supplier->subscribe(std::bind(&DataProcessor::callback, this));
    };
};

现在我想验证回调函数是否执行了正确的操作。我使用 gtest 进行测试,并使用 gmock 创建一个 IDataSupplier 的模拟来创建这个对象。

我不能直接调用 DataProcessor::callback(),因为从测试来看它是私有(private)的。我不想为我的测试更改 DataProcessor

通常,回调是可访问的,因为 IDataSupplier 可以访问包装私有(private)方法的 std::function 对象。因为我有一个模拟版本的 IDataSupplier,我认为我无法捕获提供给它的回调(而且,不得不依赖它感觉不对;如果gmock 不再允许我获取提供的 std::function?)

所以我的问题归结为这两个:

  1. 我是否通过尝试测试私有(private)回调方法做了一件坏事 (tm)?
  2. 我应该如何测试这个回调,如果我应该这样做的话?

最佳答案

早上头脑清醒的我想出了答案:

使用 gmock,您可以定义一个函数,如果您的模拟函数被调用,该函数将被调用。这允许我接收传递给订阅函数的回调,从而存储回调以供在测试中使用。按照上面的例子:

using ::testing::_;

class UnitTests_DataProcessor : public ::testing::Test {
  std::function<void()> m_dataCallback;
  MockDataSupplier m_dataSupplier;

  std::unique_ptr<DataProcessor> m_dataProcessor;

  void SetUp() override {
    ON_CALL(m_dataSupplier, subscribe(_))
      .WillOnce([this](std::function<void()> callback) { m_dataCallback = callback; });

    m_dataProcessor = std::make_unique<DataProcessor>(m_dataSupplier);
  };
};

TEST_F(UnitTests_DataProcessor, TestCallback) {
  /*
   * Contains the bound callback function of the DataProcessor class, which is still
   * defined private but accessed through the same method as the production code would.
   */
  m_dataCallback();

  // ASSERTIONS
}

关于C++ 测试私有(private)回调方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58290227/

相关文章:

testing - TestComplete - 不正确的交叉引用错误

javascript - 如何等到 vscode.windows.terminal 操作结束?

Javascript将回调函数的返回值分配给全局变量

javascript - 在回调中保留变量范围

javascript - Node js回调不适用于定义函数

c++ - 使用 GLUT 检查 Q 按钮是否被按下?

c++ - 为git存储库制作一个c文件

c++ - Windows GTest EXPECT_STREQ : error: no matching function for call to 'CmpHelperSTREQ'

c++ - 在 Metro C++ 中将图像从内容加载到 StorageFile^

java - 模拟内部实例化对象