首页 > 解决方案 > 在 expect_call 中使用的 SaveArg 值

问题描述

我必须遵循模拟函数

DoSomething(const char* par0, const char* par2)
DoSomething2(std::string);

我将 DoSomething 中的值保存到

std::string savedPar_;

我想在 DoSomething2 中使用它。怎么能做到这一点?

EXPECT_CALL(mockd_, DoSomething(_, _,))
                .WillOnce(DoAll(SaveArg<1>(&savedPar_), (Return(Ok))));
       
EXPECT_CALL(mockd_, DoSomething2(savedPar_,))
                .WillOnce((Return(Ok)))); 
      // has not yet the val


sut_->work();
// savedPar_ has the value

标签: c++c++14googletestgmock

解决方案


实现此目的的一种方法是使用SaveArgwhenDoSomething2被调用,然后比较保存的 argsDoSomethingDoSomething2

  EXPECT_CALL(mockd_, DoSomething(_, _))
                .WillOnce(DoAll(SaveArg<1>(&savedPar1_), (Return(Ok))));
       
  EXPECT_CALL(mockd_, DoSomething2(_))
                .WillOnce(DoAll(SaveArg<0>(&savedPar2_), (Return(Ok))));

  EXPECT_EQ(savedPar1_, savedPar2_);

另一种是创建一个接收指针的自定义匹配器,像这样

MATCHER_P(SameAs, value, PrintToString(*value)) { 
  return arg  == *value; 
}

你的期望看起来像这样

  EXPECT_CALL(mockd_, DoSomething(_, _))
                .WillOnce(DoAll(SaveArg<1>(&savedPar_), (Return(Ok))));
       
  EXPECT_CALL(mockd_, DoSomething2(SameAs(&savedPar_)))
                .WillOnce((Return(Ok)));

推荐阅读