我正在使用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 回答
你可能会这样做:
您的方法会复制模拟对象,但只有原始文件具有期望值 . (期望不被复制/共享) .