首页 文章

通过C中的工厂传递模拟

提问于
浏览
1

我正在使用GoogleTest在我的项目中创建单元测试 . 我想模拟实现以下接口的特定对象:

class IMockableObject
{
public:
  IMockable();
  IMockable(const IMockable &other); // copy constructor
  virtual ~IMockable();
  virtual int DoSomething() = 0;
  std::mutex UnCopyableMember;
};

我创建了两个继承此接口的类 . 第一个是真实对象(它在cpp文件中有自己的实现):

class MainImplementation : public IMockable
{
public:
  MainImplementation();
  MainImplementation(const MainImplementation &other);
  virtual int DoSomething();
};

第二个是模拟(构造函数的实现在cpp文件中):

class MockImplementation : public IMockable
{
public:
  MockImplementation();
  MockImplementation(const MockImplementation &other);
  MOCK_METHOD0(DoSomething, int());
};

我正在创建的单元测试是测试一个方法,该方法创建 IMockable 的新实例,然后调用 DoSomething . 调用此方法的对象在其构造函数中将工厂作为参数来实例化 IMockable .

ClassToTest.cpp:

ClassToTest::ClassToTest(std::function<std::unique_ptr<IMockable>()> factory)
{
    this->factory = factory;
}

void ClassToTest::MethodToTest()
{
    std::unique_ptr<IMockable> object = this->factory();
    object->DoSomething();
    //...
}

现在我的所有对象都被定义了,这是测试:

TEST(FactoryTest, DoSomethingIsCalled)
{
    MockImplementation mock;
    EXPECT_CALL(mock, DoSomething())
        .Times(AtLeast(1));

    auto factory = [mock]() 
    { 
        return std::make_unique<MockImplementation>(mock); 
    };

    ClassToTest object(factory);
    object.MethodToTest();
}

我希望测试通过,因为工厂应该获得先前创建的模拟,并在其上调用 MethodToTest . 但是测试失败了,我从谷歌模拟得到以下输出:

GMOCK警告:无趣的模拟函数调用 - 返回默认值 . 函数调用:MethodToTest()

似乎工厂得到了模拟,但忽略了它的断言 . 怎么了?

1 回答

  • 3

    你可能会这样做:

    TEST(FactoryTest, DoSomethingIsCalled)
    {
        auto factory = []()
        { 
            auto mock = std::make_unique<MockImplementation>();
            EXPECT_CALL(*mock, DoSomething()).Times(AtLeast(1));
            return mock; 
        };
    
        ClassToTest object(factory);
        object.MethodToTest();
    }
    

    您的方法会复制模拟对象,但只有原始文件具有期望值 . (期望不被复制/共享) .

相关问题