指向基 class 的 gmock 指针没有成员 gmock_
gmock pointer to base class has no member gmock_
抱歉,如果标题不清楚。
我有一个虚拟基地class:
class FileSystemInterface {
public:
virtual ~FileSystemInterface() {};
virtual void save(std::string file_content) = 0;
};
我的 mock class 来源于此:
class MockFile : public FileSystemInterface
{
public:
MOCK_METHOD1(save, void(std::string));
};
现在我有一个正在测试的方法,它采用指向 FileSystemInterface
:
的唯一指针
void my_method(std::unique_ptr<FileSystemInterface>& interface)
我的测试代码如下:
std::unique_ptr<FileSystemInterface> mockFile(new MockFile);
EXPECT_CALL(*mockFile, save(_));
my_method(mockFile);
问题是 EXPECT_CALL
给我一个错误 class "FileSystemInterface" has no member "gmock_save"
大概是因为我的 mock 是指向基 class 的指针,但是如果我按如下方式更改我的测试:
std::unique_ptr<MockFile> mockFile(new MockFile);
EXPECT_CALL(*mockFile, save(_));
my_method(mockFile);
然后 EXPECT_CALL
很好,但现在 my_method
抱怨:a reference of type "std::unique_ptr<FileSystemInterface, std::default_delete<FileSystemInterface>> &" (not const-qualified) cannot be initialized with a value of type "std::unique_ptr<MockFile, std::default_delete<MockFile>>"
如何解决这个冲突并创建我的测试?谢谢。
更新
正如 Alexey Guseynov 回答中指出的那样,我的方法确实取得了指针的所有权,所以要做的就是将我的方法更改为
void my_method(std::unique_ptr<FileSystemInterface> interface);
和运行我的测试是这样的:
std::unique_ptr<MockFile> mockFile(new MockFile);
EXPECT_CALL(*mockFile, save(_));
my_method(std::move(mockFile));
您必须将模拟存储为 MockFile,如下所示:
std::unique_ptr<MockFile> mockFile(new MockFile); // not so obvious change
EXPECT_CALL(*mockFile, save(_));
my_method(mockFile);
但是您需要更改方法的签名。引用 unique_ptr 很奇怪,因为不清楚谁拥有该对象。如果 my_method 拥有 mockFile,则通过将指针移入方法(按值传递)来转移所有权。如果 my_method 不拥有该文件,则将其作为普通指针传递。
抱歉,如果标题不清楚。
我有一个虚拟基地class:
class FileSystemInterface {
public:
virtual ~FileSystemInterface() {};
virtual void save(std::string file_content) = 0;
};
我的 mock class 来源于此:
class MockFile : public FileSystemInterface
{
public:
MOCK_METHOD1(save, void(std::string));
};
现在我有一个正在测试的方法,它采用指向 FileSystemInterface
:
void my_method(std::unique_ptr<FileSystemInterface>& interface)
我的测试代码如下:
std::unique_ptr<FileSystemInterface> mockFile(new MockFile);
EXPECT_CALL(*mockFile, save(_));
my_method(mockFile);
问题是 EXPECT_CALL
给我一个错误 class "FileSystemInterface" has no member "gmock_save"
大概是因为我的 mock 是指向基 class 的指针,但是如果我按如下方式更改我的测试:
std::unique_ptr<MockFile> mockFile(new MockFile);
EXPECT_CALL(*mockFile, save(_));
my_method(mockFile);
然后 EXPECT_CALL
很好,但现在 my_method
抱怨:a reference of type "std::unique_ptr<FileSystemInterface, std::default_delete<FileSystemInterface>> &" (not const-qualified) cannot be initialized with a value of type "std::unique_ptr<MockFile, std::default_delete<MockFile>>"
如何解决这个冲突并创建我的测试?谢谢。
更新
正如 Alexey Guseynov 回答中指出的那样,我的方法确实取得了指针的所有权,所以要做的就是将我的方法更改为
void my_method(std::unique_ptr<FileSystemInterface> interface);
和运行我的测试是这样的:
std::unique_ptr<MockFile> mockFile(new MockFile);
EXPECT_CALL(*mockFile, save(_));
my_method(std::move(mockFile));
您必须将模拟存储为 MockFile,如下所示:
std::unique_ptr<MockFile> mockFile(new MockFile); // not so obvious change
EXPECT_CALL(*mockFile, save(_));
my_method(mockFile);
但是您需要更改方法的签名。引用 unique_ptr 很奇怪,因为不清楚谁拥有该对象。如果 my_method 拥有 mockFile,则通过将指针移入方法(按值传递)来转移所有权。如果 my_method 不拥有该文件,则将其作为普通指针传递。