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
的相同地址返回相同的对象。如果您试图验证
设置数据
是否与从
获取数据
返回的地址相同,那么这也不会起作用。函数签名意味着数据的副本到处都在发生。与尝试测试地址相比,最好修改测试以检查对象是否相等。也就是说,编写一个测试函数来比较两个实例的内容
数据
,而不是尝试进行所有这些正确的引用/地址比较。