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_ptr
。 shared_ptr
推理起来更复杂,它们可以引入难以跟踪的引用计数循环(它们不是垃圾收集,没有标记和清除发生)并且更重量级,因为为 a 分配了额外的存储空间控制块。它们也较慢,因为用于控制其引用计数的原子操作。
我正在使用 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_ptr
。 shared_ptr
推理起来更复杂,它们可以引入难以跟踪的引用计数循环(它们不是垃圾收集,没有标记和清除发生)并且更重量级,因为为 a 分配了额外的存储空间控制块。它们也较慢,因为用于控制其引用计数的原子操作。