【发布时间】:2020-01-30 09:46:16
【问题描述】:
我尝试模拟一个 User 类及其嵌套结构 UserBuilder:
class User
{
public:
virtual int loadData(const std::string& filename);
virtual UserBuilder getUserBuilder(const std::string& functionName) const;
struct UserBuilder
{
UserBuilder(std::string functionName) : m_functionName{functionName} {};
virtual ~UserBuilder();
virtual UserBuilder& fun1();
virtual UserBuilder& fun2(int32_t num);
virtual bool callFunction();
private:
std::string m_functionName{};
};
}
这是用户的模拟类:
class UserMock : public User
{
public:
MOCK_METHOD1(loadData, int(const std::string& filename));
MOCK_CONST_METHOD1(getUserBuilder, UserBuilder(const std::string& functionName));
};
Thsi 是 UserBuilder 的模拟类:
struct UserBuilderMock : public User::UserBuilder
{
public:
UserBuilderMock(std::string functionName) : User::UserBuilder(functionName) {}
MOCK_METHOD0(fun1, UserBuilder&());
MOCK_METHOD1(fun2, UserBuilder&(int32_t num));
MOCK_METHOD0(callFunction, bool());
};
我想测试一下这个功能:
void useCase(std::unique_ptr<User> userP)
{
int status = userP->loadFile("init");
if (status == 0)
{
User::UserBuilder builder = userP->getUserlBuilder("init");
bool result = builder.fun1().fun2(1).callFunction();
return result;
}
else
{
return false;
}
}
我给 getUserBuilder("init") 一个模拟对象 builderMock 作为它的返回值,像这样:
auto userMock = std::make_unique<UserMock>();
ON_CALL(*userMock, loadFile("init")).WillByDefault(Return(0));
UserBuilderMock builderMock("init");
EXPECT_CALL(*userMock, getUserBuilder("init")).WillOnce(ReturnPointee(&builderMock));
EXPECT_CALL(builderMock,fun1()).Times(1);
测试日志失败:fun1 never called-unsatisfied and active。 我想用builderMock对象来调用mock方法fun1、fun2和callFunction,但是还是用了真正的UserBuilder对象 调用真正的 fun1、fun2 和 callFunction。我应该怎么做才能让它使用 Mock 对象调用 Mock 方法?
【问题讨论】:
-
virtual UserBuilder getUserBuilder(const std::string& functionName) const;没有返回指针 -
如果我将该返回值更改为: virtual std:unique_ptr
,我应该如何给 MOCK 方法 getUserBuilder() 返回值,我尝试 Return(ByRef(builderMockP), builderMockP is a unique_ptr ,它不起作用
标签: c++ unit-testing googletest googlemock