Update gMock Cookbook to reflect deprecation of testing::ByMove

PiperOrigin-RevId: 524868227
Change-Id: I702ede27570e3d3f06d534d6ccf8b39689105d07
This commit is contained in:
Abseil Team 2023-04-17 09:30:58 -07:00 committed by Copybara-Service
parent 12a5852e45
commit 922e0b7d80

View File

@ -2781,26 +2781,21 @@ action:
If you are not happy with the default action, you can tweak it as usual; see If you are not happy with the default action, you can tweak it as usual; see
[Setting Default Actions](#OnCall). [Setting Default Actions](#OnCall).
If you just need to return a pre-defined move-only value, you can use the If you just need to return a move-only value, you can use it in combination with
`Return(ByMove(...))` action: `WillOnce`. For example:
```cpp ```cpp
// When this fires, the unique_ptr<> specified by ByMove(...) will EXPECT_CALL(mock_buzzer_, MakeBuzz("hello"))
// be returned. .WillOnce(Return(std::make_unique<Buzz>(AccessLevel::kInternal)));
EXPECT_CALL(mock_buzzer_, MakeBuzz("world")) EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("hello"));
.WillOnce(Return(ByMove(std::make_unique<Buzz>(AccessLevel::kInternal))));
EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("world"));
``` ```
Note that `ByMove()` is essential here - if you drop it, the code wont compile. Quiz time! What do you think will happen if a `Return` action is performed more
than once (e.g. you write `... .WillRepeatedly(Return(std::move(...)));`)? Come
Quiz time! What do you think will happen if a `Return(ByMove(...))` action is think of it, after the first time the action runs, the source value will be
performed more than once (e.g. you write `... consumed (since its a move-only value), so the next time around, theres no
.WillRepeatedly(Return(ByMove(...)));`)? Come think of it, after the first time value to move from -- youll get a run-time error that `Return(std::move(...))`
the action runs, the source value will be consumed (since its a move-only can only be run once.
value), so the next time around, theres no value to move from -- youll get a
run-time error that `Return(ByMove(...))` can only be run once.
If you need your mock method to do more than just moving a pre-defined value, If you need your mock method to do more than just moving a pre-defined value,
remember that you can always use a lambda or a callable object, which can do remember that you can always use a lambda or a callable object, which can do
@ -2817,7 +2812,7 @@ pretty much anything you want:
``` ```
Every time this `EXPECT_CALL` fires, a new `unique_ptr<Buzz>` will be created Every time this `EXPECT_CALL` fires, a new `unique_ptr<Buzz>` will be created
and returned. You cannot do this with `Return(ByMove(...))`. and returned. You cannot do this with `Return(std::make_unique<...>(...))`.
That covers returning move-only values; but how do we work with methods That covers returning move-only values; but how do we work with methods
accepting move-only arguments? The answer is that they work normally, although accepting move-only arguments? The answer is that they work normally, although
@ -4298,7 +4293,7 @@ particular type than to dump the bytes.
### Mock std::function {#MockFunction} ### Mock std::function {#MockFunction}
`std::function` is a general function type introduced in C++11. It is a `std::function` is a general function type introduced in C++11. It is a
preferred way of passing callbacks to new interfaces. Functions are copiable, preferred way of passing callbacks to new interfaces. Functions are copyable,
and are not usually passed around by pointer, which makes them tricky to mock. and are not usually passed around by pointer, which makes them tricky to mock.
But fear not - `MockFunction` can help you with that. But fear not - `MockFunction` can help you with that.