mirror of
https://github.com/google/googletest.git
synced 2025-01-14 16:37:56 +08:00
Update gMock Cookbook to reflect deprecation of testing::ByMove
PiperOrigin-RevId: 524868227 Change-Id: I702ede27570e3d3f06d534d6ccf8b39689105d07
This commit is contained in:
parent
12a5852e45
commit
922e0b7d80
@ -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 won’t 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 it’s a move-only value), so the next time around, there’s no
|
||||||
.WillRepeatedly(Return(ByMove(...)));`)? Come think of it, after the first time
|
value to move from -- you’ll get a run-time error that `Return(std::move(...))`
|
||||||
the action runs, the source value will be consumed (since it’s a move-only
|
can only be run once.
|
||||||
value), so the next time around, there’s no value to move from -- you’ll 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.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user