通过 C++ 中的工厂传递模拟

Passing a mock through a factory in C++

我正在使用 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();
};

第二个是mock(构造函数的实现在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();
}

我希望测试能够通过,因为工厂应该获取之前创建的 mock,并对其调用 MethodToTest。但是测试失败了,我从 google Mock 得到以下输出:

GMOCK WARNING: Uninteresting mock function call - returning default value. Function call: MethodToTest()

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

你可以这样做:

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();
}

您的方法复制了模拟对象,但只有原始对象具有期望。 (预期不是copied/shared)。