Google 模拟 std::shared_prt 调用问题

Google Mock std::shared_prt Invoke Problems

我正在使用 google mock 来模拟 class 的行为。我正在嘲笑的对象是 std:shared_prt。不知何故,我无法将(模拟方法的)方法调用重定向到 class 中的另一个方法。

我要调用redirectToStartOfBaseClass()的方法,调用base的start()-方法class(NMEADataControler)

模拟 Class:

class NMEADataControler_Mock : public NMEADataControler{
   ...
   //    The method I want to redirecto to ...
   void redirectToStartOfBaseClass();
   ...
   // ... when this mock method is called
   MOCK_METHOD0(start, void());
   ...
}

class 与我正在使用的测试夹具

class TestFixtureClass : public ::testing::Test{
   ...
   std::shared_ptr<NMEADataControler_Mock> NEMADummy;
   ...
}

测试方法:

TEST_F(TestFixtureClass, StupidTest){
   ...
   ON_CALL(*NMEADummy, start())
      .WillByDefault(Invoke( ?????? ) //What parameters to I have to put in here? 
   //To redirect to *NMEADummy->redirectToStartOfBaseClass()

}

我对 C++ 不是很熟悉,对它还是个新手,所以如果我的错误很明显而且超级愚蠢,请原谅我。

P.s: 我已经搜索了很长时间的解决方案,但我找不到任何东西。这就是为什么我问你们,我很绝望,我希望你能帮助我:(

如果我没有正确理解你的问题,你只需将 NMEADataControler_Mock 实例传递给 Invoke,如下所示:

ON_CALL(*NMEADummy, start())
      .WillByDefault(Invoke( NMEADummy.get(), &NMEADataControler_Mock::redirectToStartOfBaseClass));

在这里,NMEADummy.get() returns 一个指向你的虚拟对象的裸指针。

顺便说一句:我不知道你的用例,所以 shared_ptr 在你的特定实例中可能是一个很好的调用,但它看起来不像。我建议您仅在需要单个资源的多个所有者的情况下才使用 shared_ptr。如果 Fixture 将成为您模拟的唯一所有者,我建议您使用 unique_ptrshared_ptr 推理起来更复杂,它们可以引入难以跟踪的引用计数循环(它们不是垃圾收集,没有标记和清除发生)并且更重量级,因为为 a 分配了额外的存储空间控制块。它们也较慢,因为用于控制其引用计数的原子操作。