C ++测试私有回调方法

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

我有一个类,该类将自己的私有方法注册到其他类中以用作回调。这利用std::bind创建指向私有方法的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(),因为从测试中查看时它是私有的。我不希望更改测试的DataProcessor

通常,回调是可访问的,因为IDataSupplier有权访问包装私有方法的std::function对象。因为我使用的是IDataSupplier的模拟版本,所以我认为我无法捕获提供给它的回调(同样,必须依赖于它,这是错误的;如果gmock停止允许我执行以下操作,该怎么办?得到提供的std::function?)

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

  1. 我是否通过尝试测试私有回调方法来做坏事(tm)?
  2. 如果我应该做的话,应该如何测试此回调?
c++ testing callback googletest
1个回答
0
投票

早晨,我头脑清醒地想出了答案:

使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.