将模拟对象作为函数的参数传递
passing a mock object as an argument of a function
我正在尝试使用 google 模拟框架测试 class,但不知道如何执行我的测试。
这是我的简化代码:
我在 .h 文件中有一个接口:
namespace Mynamespace
{
class IMyInterface
{
public:
virtual ~ IMyInterface() {};
virtual int myFunction() = 0;
};
}
和我的模拟 class 从接口继承:
#include <gmock/gmock.h>
#include <IMyInterface.h>
namespace testing
{
class MyClassMock : public IMyInterface
{
public:
~ MyClassMock();
MyClassMock();
MOCK_METHOD0(myFunction, int());
};
}
随着 mock 的实现 class:
#include "MyClassMock.h"
namespace testing
{
MyClassMock:: MyClassMock()
{
}
MyClassMock::~ MyClassMock()
{
}
}
我的另一个 class 将 MyClass 的对象作为函数的参数,如下所示:
#include "MyClass.h"
namespace Mynamespace
{
class AnotherClass
{
public:
AnotherClass();
~ AnotherClass();
void anotherFunction(MyClass&);
};
}
实施:
#include MyClass.h
#include AnotherClass.h
namespace Mynamespace
{
AnotherClass:: AnotherClass()
{
}
AnotherClass::~ AnotherClass()
{
}
AnotherClass::anotherFunction(MyClass& obj_myClass)
{
//does something...
}
}
然后我想使用这样的模拟来测试 AnotherClass 的功能:
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "MyClass.h"
#include "MyClassMock.h"
#include "AnotherClass.h"
using namespace testing;
using namespace std;
TEST(DirectivityParameter, CanInstantiate)
{
AnotherClass obj_anotherClass;
MyClassMock mock_myClass;
EXPECT_CALL(mock_myClass, myFunction())
.Times(1)
.WillOnce(Return(0));
obj_anotherClass.anotherFunction(&mock_myClass);
}
这会产生语义问题:
“对 'MyClass' 类型的非常量左值引用无法绑定到 'MyClasssMock *'
类型的临时对象
我很困惑,因为我认为 MyClassMock 的目的是模拟 MyClass,但这条消息告诉我并非如此。
我做错了什么?
非常感谢任何帮助!
干杯,
西蒙
您应该在您的 class MyClass
中实现 IMyInterface
,如下所示
class MyClass :IMyInterface
{
public:
virtual int myFunction();
}
并且您应该将 IMyInterface
传递给 AnotherClass
函数语法如下所示:
class AnotherClass
{
public:
AnotherClass();
~ AnotherClass();
void anotherFunction(IMyInterface *);
};
然后您可以使用您的测试代码测试您的 AnotherClass
AnotherClass obj_anotherClass;
MyClassMock mock_myClass;
EXPECT_CALL(mock_myClass, myFunction())
.Times(1)
.WillOnce(Return(0));
obj_anotherClass.anotherFunction(&mock_myClass);
我正在尝试使用 google 模拟框架测试 class,但不知道如何执行我的测试。
这是我的简化代码:
我在 .h 文件中有一个接口:
namespace Mynamespace
{
class IMyInterface
{
public:
virtual ~ IMyInterface() {};
virtual int myFunction() = 0;
};
}
和我的模拟 class 从接口继承:
#include <gmock/gmock.h>
#include <IMyInterface.h>
namespace testing
{
class MyClassMock : public IMyInterface
{
public:
~ MyClassMock();
MyClassMock();
MOCK_METHOD0(myFunction, int());
};
}
随着 mock 的实现 class:
#include "MyClassMock.h"
namespace testing
{
MyClassMock:: MyClassMock()
{
}
MyClassMock::~ MyClassMock()
{
}
}
我的另一个 class 将 MyClass 的对象作为函数的参数,如下所示:
#include "MyClass.h"
namespace Mynamespace
{
class AnotherClass
{
public:
AnotherClass();
~ AnotherClass();
void anotherFunction(MyClass&);
};
}
实施:
#include MyClass.h
#include AnotherClass.h
namespace Mynamespace
{
AnotherClass:: AnotherClass()
{
}
AnotherClass::~ AnotherClass()
{
}
AnotherClass::anotherFunction(MyClass& obj_myClass)
{
//does something...
}
}
然后我想使用这样的模拟来测试 AnotherClass 的功能:
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "MyClass.h"
#include "MyClassMock.h"
#include "AnotherClass.h"
using namespace testing;
using namespace std;
TEST(DirectivityParameter, CanInstantiate)
{
AnotherClass obj_anotherClass;
MyClassMock mock_myClass;
EXPECT_CALL(mock_myClass, myFunction())
.Times(1)
.WillOnce(Return(0));
obj_anotherClass.anotherFunction(&mock_myClass);
}
这会产生语义问题: “对 'MyClass' 类型的非常量左值引用无法绑定到 'MyClasssMock *'
类型的临时对象我很困惑,因为我认为 MyClassMock 的目的是模拟 MyClass,但这条消息告诉我并非如此。
我做错了什么? 非常感谢任何帮助!
干杯, 西蒙
您应该在您的 class MyClass
中实现 IMyInterface
,如下所示
class MyClass :IMyInterface
{
public:
virtual int myFunction();
}
并且您应该将 IMyInterface
传递给 AnotherClass
函数语法如下所示:
class AnotherClass
{
public:
AnotherClass();
~ AnotherClass();
void anotherFunction(IMyInterface *);
};
然后您可以使用您的测试代码测试您的 AnotherClass
AnotherClass obj_anotherClass;
MyClassMock mock_myClass;
EXPECT_CALL(mock_myClass, myFunction())
.Times(1)
.WillOnce(Return(0));
obj_anotherClass.anotherFunction(&mock_myClass);