【问题标题】:Invoke method on real object with gmock c++使用 gmock c++ 在真实对象上调用方法
【发布时间】:2020-05-23 15:49:15
【问题描述】:

我已经用 gmock 从一个对象中模拟了一个函数。现在我想要的是,每次调用这个函数时,它都会调用对象 A 的函数,并将 Param 作为参数传递。 下面你可以找到一个sn-p的代码

//class I want to call
class A {
public: 
    void func1(const Param& p) {cout<<p.name_<<endl;};
}

class Param {
public:
    string name_;
}


class IMock {
public:
    virtual void func2(int x) = 0;
}

class Mock : public IMock{
public: 
    MOCK_METHOD(void, func2, (int x), (override));
}

测试:

A a;
Param param;
Mock mock;
EXPECT_CALL(mock, func2(_))
    .WillOnce(
        testing::WithArg<param>(testing::Invoke(&a, a.func1)));

但我有以下编译错误:

  • param 的值在常量表达式中不可用

  • 无效使用非静态成员函数 virtual void A::func1(const Param&)

有什么想法吗?

编辑 1

在@pptaszni 响应之后,新的测试代码是:

TEST(Test_case, test_flow) {
    A a;
    Param param;
    Mock mock;
    ON_CALL(mock, func2(_)).WillDefault(testing::Invoke(
        [&a, &param]() { a.func1(param); })));
    mock.func2(23);
}

但是现在编译器说:

调用 testing::internal::OnCallSpec::WillByDefault(std::decay >::type) 没有匹配的函数 [&a, & 参数]() { a.func1(param); })); 注意:候选: testing::internal::OnCallSpec& testing::internal::OnCallSpec::WillByDefault(const testing::Action&) [with F = void(int)] OnCallSpec& WillByDefault(const Action& action) { ^~~~~~~~~~~~~ 注意:没有已知的参数 1 从“std::decay >::type {aka Test_case_test_flow::TestBody()::}”到“const testing::Action&”的转换

我正在使用 GitHub (1.10) 上提供的最新版本的 googletet

【问题讨论】:

  • 仔细看看我的回答:“lambda 表达式一定是你的Mock::func2 的签名”。在您的情况下,缺少 int 参数。正确:[&amp;a, &amp;param](int)

标签: c++ googletest googlemock


【解决方案1】:

我总是在 Invoke 中使用 lambda 表达式,因为恕我直言,这是最灵活的方法。

TEST(xxx, yyy)
{
  A a;
  Param param;
  Mock mock;
  EXPECT_CALL(mock, func2())
    .WillOnce(Invoke([&a, &param]()
    {
      a.func1(param);
    }));
  mock.func2();
}

如果您不想传递对 aparam 的引用,您可以创建一个测试夹具,将它们声明为受保护的夹具字段并将 this 传递给 lambda 捕获块。

请注意,lambda 表达式必须与Mock::func2 的签名非常相似。在此示例中,它接受 0 个参数。

你也写了

每次调用这个函数

这种情况下最好使用

ON_CALL(mock, mocked_method(/*params*/)).WillByDefault(Invoke(/*rest of the code*/));

特别是如果您有测试夹具并且可以在夹具的构造函数(或SetUp)中配置此默认操作。

【讨论】:

  • 我仍然有这个错误 error: no matching function for call to 'testing::internal::OnCallSpec&, const std ::__cxx11::basic_string&)>::WillByDefault(std::decay<:testbody> >::type)' [&a, &param]() { a. func1(参数); }));
  • 这意味着您的代码中其他地方只有一些错字(可能是模拟定义)。发布mcve,因为您问题中包含的代码也由于其他原因无法编译。指定您使用的 gtest 版本。
  • 我正在使用来自 github 的最新版本的 googlemocks,我认为是 1.10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多