C++ GMock:匹配EXPECT\u调用参数的地址
是否有方法匹配C++ GMock:匹配EXPECT\u调用参数的地址,c++,googletest,googlemock,C++,Googletest,Googlemock,是否有方法匹配EXPECT\u调用中给定参数的地址 我有如下代码: EXPECT_CALL(mock1, GetTheData()).WillOnce(Return(theData)); EXPECT_CALL(mock2, SetTheData(_)); // How to check the parameter is the same object as the one returned by GetTheData // the following was tried but does n
EXPECT\u调用中给定参数的地址
我有如下代码:
EXPECT_CALL(mock1, GetTheData()).WillOnce(Return(theData));
EXPECT_CALL(mock2, SetTheData(_)); // How to check the parameter is the same object as the one returned by GetTheData
// the following was tried but does not work
EXPECT_CALL(mock2, SetTheData(_)).WillOnce([&theData](auto param){ EXPECT_EQ(&theData, param) })
但由于SetTheData函数按值获取参数,因此地址不同。因此,在将对象传递给SetTheData函数之前,我需要找到一种获取该对象的方法
我用火柴试过一些东西,但似乎也不管用
这可能吗?如果是,怎么做?如果没有,为什么没有
编辑:
根据要求,这里有一个更完整的示例,以提供更多的上下文
struct TheData
{
// some stl containers
std::unordered_map<int, std::array<std::byte, 16>> mapToArrays;
std::unordered_map<int, long long> mapToInts;
}
class IDataFetcher
{
public:
virtual TheData GetTheData() = 0;
}
class IDataReceiver
{
public:
virtual void SetTheData(TheData theData) = 0;
}
class DataFetcherMock : public IDataFetcher
{
public:
MOCK_METHOD(TheData, GetTheData, (), (override));
}
class DataReceiverMock
{
public:
MOCK_METHOD(void, SetTheData, (TheData), (override));
}
class Sut
{
public:
Sut(std::unique_ptr<IDataFetcher> fetcher, std::unique_ptr<IDataReceiver> receiver)
void DoTheThing()
{
mReceiver->SetTheData(mFetcher->GetTheData());
}
private:
std::unique_ptr<IDataFetcher> mFetcher;
std::unique_ptr<IDataReceiver> mReceiver;
}
TEST(TestFoo, TestGroupFoo)
{
auto fetcherMock = std::make_unique<DataFetcherMock>();
auto receiverMock = std::make_unique<DataReceiverMock>();
EXPECT_CALL(*fetcherMock, GetTheData()).WillOnce(Return(theData));
EXPECT_CALL(*receiverMock, SetTheData(_)); // Here I want to check the objects are the same
Sut sut(std::move(fetcherMock), std::move(receiverMock));
sut.DoTheThing();
}
struct TheData
{
//一些stl容器
std::无序地图映射到阵列;
std::无序地图地图;
}
类IDataFetcher
{
公众:
虚拟数据GetTheData()=0;
}
伊达塔纳类
{
公众:
虚拟void设置数据(TheData TheData)=0;
}
类DataFetcherMock:公共IDataFetcher
{
公众:
MOCK_方法(TheData,gethedata,(),(override));
}
类DataReceiverMock
{
公众:
MOCK_方法(void,SetTheData,(TheData),(override));
}
Sut类
{
公众:
Sut(标准::唯一ptr取数器,标准::唯一ptr接收器)
void DoTheThing()
{
mReceiver->SetTheData(mFetcher->gethedata());
}
私人:
标准:独特的ptr蚀刻机;
std::唯一的\u ptr mReceiver;
}
测试(TestFoo、TestGroupFoo)
{
auto-fetcherMock=std::make_unique();
auto receiverMock=std::make_unique();
EXPECT_调用(*fetcherMock,GetTheData()).WillOnce(返回(theData));
EXPECT_CALL(*receiverMock,SetTheData());//这里我想检查对象是否相同
Sut-Sut(std::move(fetcherMock)、std::move(receiverMock));
sut.DoTheThing();
}
如果设置数据
按值获取其参数,则通常假定在内部存储副本,而不是相同的指针。因此,GetTheData
返回一个副本,而不是指针。您能否显示GetTheData
和SetTheData
的原始声明以及类似于theData
的类型声明的内容?这可能会消除误解。或者正如我们在这里所说的,a.我不知道您的用例,但在我看来,您不应该检查这是否是完全相同的对象,而是检查它是否等于/包含与mock1
返回的对象相同的值集。这将使用匹配器或相等运算符来解决。基于函数签名,您不可能期望GetTheData
在传递给SetTheData
的相同地址返回相同的对象。如果您试图验证设置数据
是否与从获取数据
返回的地址相同,那么这也不会起作用。函数签名意味着数据的副本到处都在发生。与尝试测试地址相比,最好修改测试以检查对象是否相等。也就是说,编写一个测试函数来比较两个实例的内容数据
,而不是尝试进行所有这些正确的引用/地址比较。