我有一个类,该类将自己的私有方法注册到其他类中以用作回调。这利用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
?)
所以我的问题归结为这两个:
早晨,我头脑清醒地想出了答案:
使用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
}