我有一个类,它向其他类注册自己的私有(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
?)
所以我的问题归结为这两个:
- 我是否通过尝试测试私有(private)回调方法做了一件坏事 (tm)?
- 我应该如何测试这个回调,如果我应该这样做的话?
最佳答案
早上头脑清醒的我想出了答案:
使用 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/