【问题标题】:Capture a void* argument from a mock function call从模拟函数调用中捕获 void* 参数
【发布时间】:2016-02-05 20:54:25
【问题描述】:

使用的模拟库:GMock

我试图捕获作为模拟对象上函数调用的一部分传递的void* 参数。我能够捕获通过 SaveArg<N> 传递的 int 值,但是当我尝试使用它来捕获 void* 参数时,它会引发编译错误

错误:gmock/include/gmock/gmock-more-actions.h:155: error: ‘const void*’ is not a pointer-to-object type

代码(相关部分):

Struct Blah
{
    int a;
    int b;
};

class SomeClass {
    void some_function(const void* arg0, u64 arg1);
};

class MockSomeClass : public SomeClass {
.
.  // Holds the mock definition
.
};

class MyClass
{
   SomeClass* _dep;

   MyClass(SomeClass* dep)
   {
       _dep = dep;
   };

   void test_function()
   {
       Blah b = new Blah();
       _dep->some_function(b, sizeof(Blah));
   }
};

TEST(SomeTestCase, One)
{
    MockSomeClass mock_object = new MockSomeClass();
    void* actual_arg;

    EXPECT_CALL(*mock_object, some_function(_,_)).WillOnce(SaveArg<0>(actual_arg)); // throws compilation err

    MyClass test_obj = new MyClass(mock_object);
    test_obj->test_function();
}

【问题讨论】:

    标签: c++ unit-testing void-pointers gmock


    【解决方案1】:

    问题是 SaveArg 需要一个地址位置来保存内容。由于我捕获了一个指针,它会将 arg 指针指向的地址保存在我提供给 saveArg 的地址位置中。所以它必须是 SaveArg(&actual_arg)。 底线:因为我捕获了一个指针而感到困惑,尽管 actual_arg 本身是一个指针 SaveArg 期望它在内存中的地址,因此它可以保存内容。

    【讨论】:

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