0

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

此外,我正在模拟的例程接受对接口的引用,但传入的对象存储在 shared_ptr 中。如果我使用 .With 并传递 shared_ptr 对象,我得到一个错误报告 comparer::compare can't match template parameters,这是可以理解的。因此,如果我只是传入对接口的引用,我会得到一个错误,不能实例化纯虚拟类。

在使用 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);
}
4

1 回答 1

2

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

第一次调用应该可以工作,但看起来 .With 正在尝试复制您的对象而不是使用引用。您可以使用 Hippomocks::byRef 明确指示它应该使用 this 作为引用而不是可复制的实例,以便它将使用您的实例。这样做会隐含地导致在实际调用发生之前超出范围的临时对象可能会崩溃。

从 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);
于 2015-03-26T10:00:37.317 回答