指向基 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 不拥有该文件,则将其作为普通指针传递。