c++ - Google Mock std::shared_ptr 调用问题

标签 c++ unit-testing mocking googletest googlemock

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

我要调用redirectToStartOfBaseClass()的方法,调用了start()-基类(NMEADataControler)的方法

模拟类:

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 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()将裸指针返回给您的虚拟对象。

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

关于c++ - Google Mock std::shared_ptr 调用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52755720/

相关文章:

c++ - 用 C++ 编写原型(prototype)构造函数

c++ - 为什么有些类方法返回 "*this"(自身的对象引用)?

C++检查unicode字符是否为全角

angular - 在 Angular CLI 项目中使用 Jasmine 自定义匹配器

javascript - 如何断言两个数组不相交?

ios - 我应该重构以便能够在 XCTests 中使用模拟吗?

c++ - C++ 中 QVariant 的等价物是什么?

unit-testing - 如何跳过 PHPUnit 中的前 N ​​个测试?

C# - 单元测试,模拟?

java - 为什么当我添加 "RunWith"注释时 Spring Autowire 停止工作?