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);
}
方法一:
您可以使用自定义匹配器,正如提到的另一个答案,但是请注意,使用自定义匹配器的首选方式是使用仿函数,而不是 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。
我想做这样的事情:
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);
}
方法一:
您可以使用自定义匹配器,正如提到的另一个答案,但是请注意,使用自定义匹配器的首选方式是使用仿函数,而不是 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。