【问题标题】:Google mock invoke function with parameters带参数的 Google 模拟调用函数
【发布时间】:2022-07-26 10:05:31
【问题描述】:
static bool helper(int a){
   // do something here
   return true;
}  

  class ProxyMock : public Proxy
    {
        public:
            MOCK_METHOD1(functionA, bool(
                int a
            ));
    };


TEST(xxx, xxx){
   ProxyMock mock;
   int a;
   EXPECT_CALL(mock, functionA(5)).WillOnce(testing::Invoke(helper(a));  
}

当使用参数(5)调用模拟对象的functionA时,我想调用一个静态全局函数helper,它接受我想要的参数。 编译时出现错误: 'function' cannot be used as a functionEXPECT_CALL 行中。怎么了?

【问题讨论】:

  • 错误信息是否更详细?

标签: c++ googletest googlemock


【解决方案1】:

Invoke 需要一个仿函数。 Functor 是可以调用的东西(使用operator()),例如函数指针、重载 operator() 的结构或 lambda。
此外,它要求仿函数匹配关于参数类型和返回类型的模拟函数(您的 helper 符合该标准),并且它总是将模拟函数接收到的参数传递给该仿函数(您不想要)。

如果您想调用具有不同参数的函数,最简单的方法是使用 InvokeWithoutArgs 和 lambda:

   EXPECT_CALL(mock, functionA(5)).WillOnce(
        testing::InvokeWithoutArgs(
            [a](){return helper(a);}
        )
    );  

See it online

【讨论】:

  • Invoke 不需要仿函数。它可以采用谷歌模拟文档定义的任何可调用对象。此外,即使没有InvokeWithoutArgs,您也可以直接传递 lambda。
  • @Ari 我同意,我的意思是“可调用”而不是“函子”,但是因为你什么时候可以将 lambda 作为Action 传递?我主要使用 Gtest 1.8,我认为当时是不允许的。
【解决方案2】:

您可以直接将可以访问a 的零参数的可调用对象传递给WillOnce。最简单的方法是使用 lambda:

EXPECT_CALL(mock, functionA(5))
  .WillOnce([a]() { return helper(a); });

请注意,Invoke 传递的参数与传递给被测函数的参数相同。所以只有当你想将5 传递给helper 时才应该使用它:

EXPECT_CALL(mock, functionA(5))
   .WillOnce(testing::Invoke(helper));  // helper(5) will be called.

作为替代方案,您可以使用InvokeWithoutArgs,它的作用类似于Invoke,但不会将任何参数传递给作为其参数的可调用对象,但是您应该再次使用lambda 捕获之类的东西来访问@987654331 @,所以没必要。

现场示例:https://godbolt.org/z/vqdxT86E4

【讨论】:

    猜你喜欢
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多