c++ - GMOCK - 如何在返回类型为 void 时修改方法参数

标签 c++ googlemock

我有一个类接受指向另一个类的指针并有一个方法 read():

class B:
{
public:
......
void read(char * str);
......
};

class A
{
public:
A(B *bobj):b(bobj);
B* b;
void read (char * str);
..........
};

我像下面这样调用对象

A * aobj = new A(new B());

现在我应该能够访问两个类的读取方法,如下所示:

char text[100];
b->read(text)
aobj->read(text)

A 和 B 类的方法 read 被编码为将一些值复制到提供的输入数组中。

如何编写函数的 MOCK 方法来将参数修改为特定值?

ON_CALL(*b, read(::testing::_)).WillByDefault(::testing::Return(outBuffer));

给我一​​个编译问题,因为 read 方法不能按定义返回值?

最佳答案

我已经使用 Invoke 函数来实现这一点。这是示例代码。

如果你使用 >=c++11 那么,你可以简单地给 Invoke 函数一个 lambda。

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

using ::testing::Mock;
using ::testing::_;
using ::testing::Invoke;

class actual_reader
{
   public:
   virtual void read(char* data)
   {   
      std::cout << "This should not be called" << std::endl;
   }   
};
void mock_read_function(char* str)
{
   strcpy(str, "Mocked text");
}

class class_under_test
{
   public:
      void read(actual_reader* obj, char *str)
      {   
         obj->read(str);
      }   
};

class mock_reader : public actual_reader
{
   public:
   MOCK_METHOD1(read, void(char* str));
};


TEST(test_class_under_test, test_read)
{
   char text[100];

   mock_reader mock_obj;
   class_under_test cut;

   EXPECT_CALL(mock_obj, read(_)).WillOnce(Invoke(mock_read_function));
   cut.read(&mock_obj, text);
   std::cout << "Output : " << text << std::endl;

   // Lambda example
   EXPECT_CALL(mock_obj, read(_)).WillOnce(Invoke(
            [=](char* str){
               strcpy(str, "Mocked text(lambda)");
            }));
   cut.read(&mock_obj, text);
   std::cout << "Output : " << text << std::endl;



}

关于c++ - GMOCK - 如何在返回类型为 void 时修改方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46092758/

相关文章:

c++ - 如果不包含<string.h>,为什么我的程序可以成功编译?

c++ - 模板化模拟类中的 MOCK_METHODx() 定义缺少“typename”

c++ - GoogleMock:如何保存要在模拟的下一次调用中使用的参数

c++ - 如何正确地使模拟方法调用原始虚方法

c++ - GNU GMP 中 mpz_class 的 sizeinbase

c++ - 使用 C/C++ 创建多线程应用程序的最简单方法是什么?

c# - 如何在 dll 中创建可以通过运行它的应用程序更改的条件

c++ - C++获取DLL版本

c++ - 在 gmock 中使用指向带有 EXPECT_CALL 的模拟对象的指针会导致段错误或默认处理程序启动

c++ - 抑制模拟类 vector 的 gmock 警告