HippoMock总是抛出NotImplemented

时间:2014-12-20 01:35:45

标签: c++ pure-virtual hippomocks

我尝试使用HippoMock模拟接口,以便在使用所述接口的类中使用。我构建了一个模拟对象并设置了ExceptCallOverload,一切都编译得很好。但是我正在测试的类调用mock对象调用mock :: NotImplemented函数。

此外,我正在模拟的例程接受对接口的引用,但是在a中传递的对象存储在shared_ptr中。如果我挂墙。使用并传递shared_ptr对象,我得到一个错误报告comparer :: compare不能匹配模板参数,这是可以理解的。因此,如果我只是传入对接口的引用,我会得到一个错误,那么纯虚拟类就无法实例化。

我觉得这让我在使用HippoMark方面处于摇滚和艰难的地方之间。

一个小例子:

class objectA_interface
{
public:
   virtual double getDouble() = 0;
};

class objectB_interface
{
public:
   virtual double getDouble() = 0;
};

class test_interface
{
public:
   virtual void fun(objectA_interface&) = 0;
   virtual void fun(objectB_interface&) = 0;
};

void do_something()
{
   std::shared_ptr<objectA_interface> objectA;
   std::shared_ptr<objectB_interface> objectB;

   MockRepository mocks;
   test_interface* mock_interface = mocks.Mock<test_interface>();

   //error C2259: 'object_interface' : cannot instantiate abstract class
   mocks.ExpectCallOverload(mock_interface, (void (test_interface::*)(objectA_interface&))&test_interface::fun).With(*objectA);
   mocks.ExpectCallOverload(mock_interface, (void (test_interface::*)(objectB_interface&))&test_interface::fun).With(*objectB);

   //error C2665: 'HippoMocks::comparer<A>::compare' : none of the 2 overloads could convert all the argument types
   mocks.ExpectCallOverload(mock_interface, (void (test_interface::*)(objectA_interface&))&test_interface::fun).With(objectA);
   mocks.ExpectCallOverload(mock_interface, (void (test_interface::*)(objectB_interface&))&test_interface::fun).With(objectB);
}

1 个答案:

答案 0 :(得分:2)

您无法将shared_ptr作为平面引用传递给任何函数。这就解释了为什么第二个调用不起作用 - shared_ptr不是引用。

第一个调用应该可以工作,但它看起来像.With正在尝试复制您的对象而不是使用引用。您可以使用Hippomocks :: byRef明确指出它应该使用它作为引用而不是可复制的实例,以便它将使用您的实例。隐式执行此操作会导致在实际调用发生之前超出范围的临时值可能会崩溃。

从test_ref_args.cpp中的测试代码,确切的情况:

class IRefArg {
public:
        virtual void test() = 0;
};

    MockRepository mocks;
    IK *iamock = mocks.Mock<IK>();
    IRefArg *refArg = mocks.Mock<IRefArg>();

    mocks.ExpectCall(iamock, IK::l).With(byRef(*refArg));
    iamock->l(*refArg);