通过 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)。
我正在使用 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)。