我正在使用 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_ptr
。 shared_ptr
推理起来更复杂,它们可以引入难以跟踪的引用计数循环(它们不是垃圾收集,没有标记和清除发生)并且更重量级,因为额外的存储分配给一个控制 block 。它们也较慢,因为用于控制其引用计数的原子操作。
关于c++ - Google Mock std::shared_ptr 调用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52755720/