C++ 使用指向mock对象的指针在googlemock中设置期望值

C++ 使用指向mock对象的指针在googlemock中设置期望值,c++,googletest,gmock,C++,Googletest,Gmock,我请求您提供有关使用指向mock对象的指针设置mock方法期望值的输入/建议/帮助。 堆栈位于CPP中,应用程序使用new运算符创建堆栈类的对象。 在单元测试中,需要对源代码中创建的模拟对象设置期望值。 先谢谢你 请在下面查找代码段: StackBT.h class StackBT { MOCK_METHOD0(registerCallbacks, void()); MOCK_METHOD2(...) MOCK_METHOD4(...) } ApplicationBT.h:

我请求您提供有关使用指向mock对象的指针设置mock方法期望值的输入/建议/帮助。 堆栈位于CPP中,应用程序使用new运算符创建堆栈类的对象。 在单元测试中,需要对源代码中创建的模拟对象设置期望值。 先谢谢你

请在下面查找代码段:

StackBT.h
class StackBT
{
   MOCK_METHOD0(registerCallbacks, void());
   MOCK_METHOD2(...)
   MOCK_METHOD4(...)
}

ApplicationBT.h:
class ApplicationBT
{
   public:
   ApplicationBT() : mpoStackBT(new StackBT())

   void init()
   {
      mpoStackBT->registerCallbacks();
   }

   friend class TestApplicationBT;

   StackBT* mpoStackBT;
}

TestApplicationBT.h
class TestApplicationBT : public ::testing::Test
{
   protected:
      virtual void SetUp ()
      {
         ptrApplicationBT = new ApplicationBT();
      }
      void TearDown()
      {
         delete ptrApplicationBT;
      }
   public:
      TestApplicationBT ()
      {
      }

      ~TestApplicationBT ()
      {
         ptrApplicationBT = NULL;
      }

      scoped_ptr<ApplicationBT> ptrApplicationBT;
};

TEST_F(TestApplicationBT, TEST_FUNC_CALL_IN_MOCK_CREATED_INSIDE_ApplicationBT_USING_NEW)
{
   EXPECT_CALL(ptrApplicationBT->mpoStackBT, registerCallbacks()).Times(1);//Need to pass the object instead of the reference to StackBT
   ptrApplicationBT->init();
}
StackBT.h
类StackBT
{
模拟方法0(registerCallbacks,void());
模拟方法2(…)
模拟方法4(…)
}
应用程序bt.h:
类应用程序BT
{
公众:
ApplicationBT():mpoStackBT(新的StackBT())
void init()
{
mpoStackBT->registerCallbacks();
}
朋友类测试应用BT;
StackBT*mpoStackBT;
}
测试应用程序bt.h
类TestApplicationBT:public::testing::Test
{
受保护的:
虚拟无效设置()
{
ptrApplicationBT=新应用程序bt();
}
void TearDown()
{
删除ptrApplicationBT;
}
公众:
测试应用程序BT()
{
}
~TestApplicationBT()
{
ptrApplicationBT=NULL;
}
作用域的ptr ptrApplicationBT;
};
测试(TestApplicationBT,TEST FUNC调用在模拟中创建,在应用程序BT内部使用新创建)
{
EXPECT_调用(ptrApplicationBT->mpoStackBT,registerCallbacks())。次(1);//需要传递对象而不是对StackBT的引用
ptrApplicationBT->init();
}

为什么模拟对象的指针放在第一位?原因是StackBT是在应用程序BT内部使用源代码中的新运算符创建的。调用ApplicationBT::init()时,stackBT::registerCallbacks()。因此,我需要在TestApplicationBT中获取在ApplicationBT内部创建的此StackBT的引用,以便能够为模拟对象的同一实例设置期望值。无论如何,简单的取消引用应该可以在期望值处指定模拟对象。但是我仍然不明白,为什么它需要是
ApplicationBT
类中的指针。我担心简单的去引用会起作用。我尝试了EXPECT_调用(*(ptrApplicationBT->mpoStackBT),registerCallbacks())。次(1);下面抛出了编译错误:“define EXPECT CALL(obj,CALL)GMOCK\u EXPECT\u CALL\u IMPL(obj,CALL),没有运算符”“匹配这些操作数”“我自己正在使用指针模拟对象,我可以确认解引用是有效的。这不是一般的问题,只是代码中的一些内容