HippoMock 总是抛出 NotImplement

HippoMock always throwing NotImplemented

本文关键字:NotImplement HippoMock      更新时间:2023-10-16

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

此外,我模拟的例程接受对接口的引用,但在 a 中传递的对象存储在shared_ptr中。如果我墙.使用并传递shared_ptr对象,我得到一个错误报告比较器::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);
}

您实际上不能将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);