gmock 中是否有一种方法可以在不调用的情况下 return 修改输入参数?

Is there a way in gmock to return modified input arg without invoke?

我想做这样的事情:

EXPECT_CALL(*mock, method(5)).WillOnce(Return(arg1 * 2));

其中 arg1 应等于被调用方法的第一个 arg。没有 testing::Invoke 有没有办法做到这一点?

您可以为此定义自定义操作:

ACTION(ReturnDoubled) {
    return arg0 * 2;
}

class Mock {
   public:
    MOCK_METHOD(int, method, (int), ());
};

TEST(Foo, bar) {
    Mock mock;
    EXPECT_CALL(mock, method(5)).WillOnce(ReturnDoubled());

    ASSERT_EQ(mock.method(5), 10);
}

https://godbolt.org/z/dare654Yj

方法一:

您可以使用自定义匹配器,正如提到的另一个答案,但是请注意,使用自定义匹配器的首选方式是使用仿函数,而不是 ACTION 宏(参见 here) .

这是一个例子:

// Define a functor first:
struct Double {
  template <typename T>
  T operator()(T arg) {
    return 2 * (arg);
  }
};


TEST(MyTest, CanDoubleWithFunctor) {
  MyMock mock;

  // Use the functor in the test:
  EXPECT_CALL(mock, method(5)).WillOnce(Double{});

  EXPECT_EQ(mock.method(5), 10);
}

在此处查看工作示例:https://godbolt.org/z/h4aaPdWMs


方法二:

除了自定义匹配器之外,您还可以使用 WithArg see here,并将第一个参数传递给它,然后将其传递给接受一个参数的函数。此函数可以是独立的,也可以是 lambda 函数:

class MyMock {
 public:
  MOCK_METHOD(int, method, (int), ());
};

TEST(MyTest, CanDouble) {
  MyMock mock;

  EXPECT_CALL(mock, method(5)).WillOnce(WithArg<0>([](int x) {
    return x * 2;
  }));

  EXPECT_EQ(mock.method(5), 10);
}

看到这个working example