gpt4 book ai didi

c++ - 如何将 std::function 作为参数传递给 gmock 中的模拟方法?

转载 作者:行者123 更新时间:2023-12-02 10:01:24 26 4
gpt4 key购买 nike

尝试传递 std:function 时出现运行时错误作为 EXPECT_CALL 中的模拟方法的参数.
我想验证 Barcallback 调用作为论据。

代码:

#include <gtest/gtest.h>
#include <gmock/gmock.h>

class Foo {
public:
virtual void Bar(const std::function<void (const std::string &name)> &callback) = 0;
};

class MockFoo : public Foo {
public:
MOCK_METHOD(void, Bar, (const std::function<void (const std::string &name)> &callback));
};

TEST(FooBarTest, callback) {
MockFoo foo;

const std::function<void(const std::string &name)> callback;

EXPECT_CALL(foo, Bar(callback)).Times(1);

foo.Bar(callback);
}

int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

运行时产生错误:
/usr/local/include/gtest/gtest-matchers.h:211:60: error: no match for ‘operator==’ (operand types are ‘const std::function<void(const std::__cxx11::basic_string<char>&)>’ and ‘const std::function<void(const std::__cxx11::basic_string<char>&)>’)
bool operator()(const A& a, const B& b) const { return a == b; }

最佳答案

有预定义的ACTIONS您可以用于此目的。您的 EXPECT_CALL看起来像:

using namespace testing; // for brevity

TEST(FooBarTest, callback) {
MockFoo foo;

const std::function<void(const std::string &name)> callback;

EXPECT_CALL(foo, Bar(_)).WillOnce(Invoke(callback));

foo.Bar(callback);
}

正如@IanGralinski 所指出的, std::function 没有匹配器,因此您可以使用任何匹配器进行调用(即 _ )。

但是,这不是我在这里使用 gmock 的方式——为什么要模拟 Foo如果你直接使用它?当您测试(真实)类与其他类(模拟)的交互时,通常会使用模拟。所以在你的例子中: Foo可以被 MockFoo mock 并由其他一些类(真正的类)使用,使用依赖注入(inject)。

附带说明,请记住将虚拟析构函数添加到 Foo如果对象派生自 Foo将被指向 Foo的指针删除(这将是没有虚拟 dtor 的 UB)。

关于c++ - 如何将 std::function 作为参数传递给 gmock 中的模拟方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62419039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com