gpt4 book ai didi

c++ - 如何使用已删除的复制构造器模拟方法返回对象?

转载 作者:可可西里 更新时间:2023-11-01 17:36:45 29 4
gpt4 key购买 nike

如果一个接口(interface)有一个函数来创建一个带有删除的复制构造函数的对象,如何模拟这个函数?Gmock 似乎在内部使用对象的复制构造函数。

例如

// The object with deleted copy-ctor and copy-assignment
class TTest
{
public:
TTest() = delete;
TTest(const TTest&) = delete;
TTest& operator=(const TTest&) = delete;
TTest(TTest&&) = default;
TTest& operator=(TTest&&) = default;

explicit TTest(int) {
}
};

// My interface to mock
class MyInterface
{
public:
virtual ~MyInterface() {}
virtual TTest GetUniqueTest() = 0;
};

// The mock
class MockMyInterface: public MyInterface{
public:
MOCK_METHOD0(GetUniqueTest, TTest());
}

编译错误说:

gmock/gmock-spec-builders.h:1330:20: error: use of deleted function 'TTest::TTest(const TTest&)'
T retval(value_);
...
gmock/gmock-actions.h:190:52: error: use of deleted function 'TTest::TTest(const TTest&)'
internal::BuiltInDefaultValue<T>::Get() : *value_;
...
gmock/internal/gmock-internal-utils.h:371:71: error: use of deleted function 'TTest::TTest(const TTest&)'
*static_cast<volatile typename remove_reference<T>::type*>(NULL));

如果方法返回std::unique_ptr<T> ,错误与std::unique_ptr<T>相同也删除了 copy-ctor。

所以我的问题是:如何模拟此类返回带有已删除复制构造函数的对象的方法?

我使用的是 googletest v1.7、GCC 5.3.0 和 Ubuntu 14.04.1。

最佳答案

在这里回答我自己的问题只是为了提供最新信息。

对于 googletest release 1.8.0 或更高版本,它引入了 ByMove(...)并原生支持返回仅移动类型。

所以代码编译正常:

class MockMyInterface: public MyInterface{
public:
MOCK_METHOD0(GetUniqueTest, TTest());
}

但在运行时它会抛出异常,因为 gmock 不知道如何返回默认值 TTest :

C++ exception with description "Uninteresting mock function call - returning default value.
Function call: GetUniqueTest()
The mock function has no default action set, and its return type has no default value set." thrown in the test body.

这可以通过在模拟类中设置默认操作轻松解决:

ON_CALL(*this, GetUniqueTest()).WillByDefault(Return(ByMove(TTest(0))));

注意:对于std::unique_ptr<T>没关系,因为它有默认构造函数,一个 nullptr unique_ptr默认返回。

综上所述,如果使用 googletest 1.8.0 或更高版本,我们可以:

// My interface to mock
class MyInterface
{
public:
virtual ~MyInterface() {}
virtual TTest GetUniqueTest() = 0;
virtual std::unique_ptr<int> GetUniqueInt() = 0;
};

// The mock
class MockMyInterface: public MyInterface{
public:
MOCK_METHOD0(GetUniqueTest, TTest());
MOCK_METHOD0(GetUniqueInt, std::unique_ptr<int>());
MockMyInterface() {
ON_CALL(*this, GetUniqueTest())
.WillByDefault(Return(ByMove(TTest(0))));
}
};

引用:[使用仅移动类型的模拟方法]( https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md#mocking-methods-that-use-move-only-types )

关于c++ - 如何使用已删除的复制构造器模拟方法返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42505119/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com