繁体   English   中英

带参数的 Google 模拟调用函数

[英]Google mock invoke function with parameters

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)调用模拟对象的函数A时,我想调用一个静态全局函数helper ,它接受我想要的参数。 编译时出现错误: 'function' cannot be used as a function EXPECT_CALL行中的函数。 怎么了?

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

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

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

在网上看到

您可以直接将一个零参数的可调用对象传递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 捕获之类的东西来访问a ,因此没有必要。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM