OpenCores
URL https://opencores.org/ocsvn/s80186/s80186/trunk

Subversion Repositories s80186

[/] [s80186/] [trunk/] [vendor/] [googletest/] [googlemock/] [docs/] [FrequentlyAskedQuestions.md] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jamieiles
 
2
 
3
Please send your questions to the
4
[googlemock](http://groups.google.com/group/googlemock) discussion
5
group. If you need help with compiler errors, make sure you have
6
tried [Google Mock Doctor](#How_am_I_supposed_to_make_sense_of_these_horrible_template_error.md) first.
7
 
8
## When I call a method on my mock object, the method for the real object is invoked instead.  What's the problem? ##
9
 
10
In order for a method to be mocked, it must be _virtual_, unless you use the [high-perf dependency injection technique](CookBook.md#mocking-nonvirtual-methods).
11
 
12
## I wrote some matchers.  After I upgraded to a new version of Google Mock, they no longer compile.  What's going on? ##
13
 
14
After version 1.4.0 of Google Mock was released, we had an idea on how
15
to make it easier to write matchers that can generate informative
16
messages efficiently.  We experimented with this idea and liked what
17
we saw.  Therefore we decided to implement it.
18
 
19
Unfortunately, this means that if you have defined your own matchers
20
by implementing `MatcherInterface` or using `MakePolymorphicMatcher()`,
21
your definitions will no longer compile.  Matchers defined using the
22
`MATCHER*` family of macros are not affected.
23
 
24
Sorry for the hassle if your matchers are affected.  We believe it's
25
in everyone's long-term interest to make this change sooner than
26
later.  Fortunately, it's usually not hard to migrate an existing
27
matcher to the new API.  Here's what you need to do:
28
 
29
If you wrote your matcher like this:
30
```
31
// Old matcher definition that doesn't work with the latest
32
// Google Mock.
33
using ::testing::MatcherInterface;
34
...
35
class MyWonderfulMatcher : public MatcherInterface {
36
 public:
37
  ...
38
  virtual bool Matches(MyType value) const {
39
    // Returns true if value matches.
40
    return value.GetFoo() > 5;
41
  }
42
  ...
43
};
44
```
45
 
46
you'll need to change it to:
47
```
48
// New matcher definition that works with the latest Google Mock.
49
using ::testing::MatcherInterface;
50
using ::testing::MatchResultListener;
51
...
52
class MyWonderfulMatcher : public MatcherInterface {
53
 public:
54
  ...
55
  virtual bool MatchAndExplain(MyType value,
56
                               MatchResultListener* listener) const {
57
    // Returns true if value matches.
58
    return value.GetFoo() > 5;
59
  }
60
  ...
61
};
62
```
63
(i.e. rename `Matches()` to `MatchAndExplain()` and give it a second
64
argument of type `MatchResultListener*`.)
65
 
66
If you were also using `ExplainMatchResultTo()` to improve the matcher
67
message:
68
```
69
// Old matcher definition that doesn't work with the lastest
70
// Google Mock.
71
using ::testing::MatcherInterface;
72
...
73
class MyWonderfulMatcher : public MatcherInterface {
74
 public:
75
  ...
76
  virtual bool Matches(MyType value) const {
77
    // Returns true if value matches.
78
    return value.GetFoo() > 5;
79
  }
80
 
81
  virtual void ExplainMatchResultTo(MyType value,
82
                                    ::std::ostream* os) const {
83
    // Prints some helpful information to os to help
84
    // a user understand why value matches (or doesn't match).
85
    *os << "the Foo property is " << value.GetFoo();
86
  }
87
  ...
88
};
89
```
90
 
91
you should move the logic of `ExplainMatchResultTo()` into
92
`MatchAndExplain()`, using the `MatchResultListener` argument where
93
the `::std::ostream` was used:
94
```
95
// New matcher definition that works with the latest Google Mock.
96
using ::testing::MatcherInterface;
97
using ::testing::MatchResultListener;
98
...
99
class MyWonderfulMatcher : public MatcherInterface {
100
 public:
101
  ...
102
  virtual bool MatchAndExplain(MyType value,
103
                               MatchResultListener* listener) const {
104
    // Returns true if value matches.
105
    *listener << "the Foo property is " << value.GetFoo();
106
    return value.GetFoo() > 5;
107
  }
108
  ...
109
};
110
```
111
 
112
If your matcher is defined using `MakePolymorphicMatcher()`:
113
```
114
// Old matcher definition that doesn't work with the latest
115
// Google Mock.
116
using ::testing::MakePolymorphicMatcher;
117
...
118
class MyGreatMatcher {
119
 public:
120
  ...
121
  bool Matches(MyType value) const {
122
    // Returns true if value matches.
123
    return value.GetBar() < 42;
124
  }
125
  ...
126
};
127
... MakePolymorphicMatcher(MyGreatMatcher()) ...
128
```
129
 
130
you should rename the `Matches()` method to `MatchAndExplain()` and
131
add a `MatchResultListener*` argument (the same as what you need to do
132
for matchers defined by implementing `MatcherInterface`):
133
```
134
// New matcher definition that works with the latest Google Mock.
135
using ::testing::MakePolymorphicMatcher;
136
using ::testing::MatchResultListener;
137
...
138
class MyGreatMatcher {
139
 public:
140
  ...
141
  bool MatchAndExplain(MyType value,
142
                       MatchResultListener* listener) const {
143
    // Returns true if value matches.
144
    return value.GetBar() < 42;
145
  }
146
  ...
147
};
148
... MakePolymorphicMatcher(MyGreatMatcher()) ...
149
```
150
 
151
If your polymorphic matcher uses `ExplainMatchResultTo()` for better
152
failure messages:
153
```
154
// Old matcher definition that doesn't work with the latest
155
// Google Mock.
156
using ::testing::MakePolymorphicMatcher;
157
...
158
class MyGreatMatcher {
159
 public:
160
  ...
161
  bool Matches(MyType value) const {
162
    // Returns true if value matches.
163
    return value.GetBar() < 42;
164
  }
165
  ...
166
};
167
void ExplainMatchResultTo(const MyGreatMatcher& matcher,
168
                          MyType value,
169
                          ::std::ostream* os) {
170
  // Prints some helpful information to os to help
171
  // a user understand why value matches (or doesn't match).
172
  *os << "the Bar property is " << value.GetBar();
173
}
174
... MakePolymorphicMatcher(MyGreatMatcher()) ...
175
```
176
 
177
you'll need to move the logic inside `ExplainMatchResultTo()` to
178
`MatchAndExplain()`:
179
```
180
// New matcher definition that works with the latest Google Mock.
181
using ::testing::MakePolymorphicMatcher;
182
using ::testing::MatchResultListener;
183
...
184
class MyGreatMatcher {
185
 public:
186
  ...
187
  bool MatchAndExplain(MyType value,
188
                       MatchResultListener* listener) const {
189
    // Returns true if value matches.
190
    *listener << "the Bar property is " << value.GetBar();
191
    return value.GetBar() < 42;
192
  }
193
  ...
194
};
195
... MakePolymorphicMatcher(MyGreatMatcher()) ...
196
```
197
 
198
For more information, you can read these
199
[two](CookBook.md#writing-new-monomorphic-matchers)
200
[recipes](CookBook.md#writing-new-polymorphic-matchers)
201
from the cookbook.  As always, you
202
are welcome to post questions on `googlemock@googlegroups.com` if you
203
need any help.
204
 
205
## When using Google Mock, do I have to use Google Test as the testing framework?  I have my favorite testing framework and don't want to switch. ##
206
 
207
Google Mock works out of the box with Google Test.  However, it's easy
208
to configure it to work with any testing framework of your choice.
209
[Here](ForDummies.md#using-google-mock-with-any-testing-framework) is how.
210
 
211
## How am I supposed to make sense of these horrible template errors? ##
212
 
213
If you are confused by the compiler errors gcc threw at you,
214
try consulting the _Google Mock Doctor_ tool first.  What it does is to
215
scan stdin for gcc error messages, and spit out diagnoses on the
216
problems (we call them diseases) your code has.
217
 
218
To "install", run command:
219
```
220
alias gmd='/scripts/gmock_doctor.py'
221
```
222
 
223
To use it, do:
224
```
225
  2>&1 | gmd
226
```
227
 
228
For example:
229
```
230
make my_test 2>&1 | gmd
231
```
232
 
233
Or you can run `gmd` and copy-n-paste gcc's error messages to it.
234
 
235
## Can I mock a variadic function? ##
236
 
237
You cannot mock a variadic function (i.e. a function taking ellipsis
238
(`...`) arguments) directly in Google Mock.
239
 
240
The problem is that in general, there is _no way_ for a mock object to
241
know how many arguments are passed to the variadic method, and what
242
the arguments' types are.  Only the _author of the base class_ knows
243
the protocol, and we cannot look into his head.
244
 
245
Therefore, to mock such a function, the _user_ must teach the mock
246
object how to figure out the number of arguments and their types.  One
247
way to do it is to provide overloaded versions of the function.
248
 
249
Ellipsis arguments are inherited from C and not really a C++ feature.
250
They are unsafe to use and don't work with arguments that have
251
constructors or destructors.  Therefore we recommend to avoid them in
252
C++ as much as possible.
253
 
254
## MSVC gives me warning C4301 or C4373 when I define a mock method with a const parameter.  Why? ##
255
 
256
If you compile this using Microsoft Visual C++ 2005 SP1:
257
```
258
class Foo {
259
  ...
260
  virtual void Bar(const int i) = 0;
261
};
262
 
263
class MockFoo : public Foo {
264
  ...
265
  MOCK_METHOD1(Bar, void(const int i));
266
};
267
```
268
You may get the following warning:
269
```
270
warning C4301: 'MockFoo::Bar': overriding virtual function only differs from 'Foo::Bar' by const/volatile qualifier
271
```
272
 
273
This is a MSVC bug.  The same code compiles fine with gcc ,for
274
example.  If you use Visual C++ 2008 SP1, you would get the warning:
275
```
276
warning C4373: 'MockFoo::Bar': virtual function overrides 'Foo::Bar', previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers
277
```
278
 
279
In C++, if you _declare_ a function with a `const` parameter, the
280
`const` modifier is _ignored_.  Therefore, the `Foo` base class above
281
is equivalent to:
282
```
283
class Foo {
284
  ...
285
  virtual void Bar(int i) = 0;  // int or const int?  Makes no difference.
286
};
287
```
288
 
289
In fact, you can _declare_ Bar() with an `int` parameter, and _define_
290
it with a `const int` parameter.  The compiler will still match them
291
up.
292
 
293
Since making a parameter `const` is meaningless in the method
294
_declaration_, we recommend to remove it in both `Foo` and `MockFoo`.
295
That should workaround the VC bug.
296
 
297
Note that we are talking about the _top-level_ `const` modifier here.
298
If the function parameter is passed by pointer or reference, declaring
299
the _pointee_ or _referee_ as `const` is still meaningful.  For
300
example, the following two declarations are _not_ equivalent:
301
```
302
void Bar(int* p);        // Neither p nor *p is const.
303
void Bar(const int* p);  // p is not const, but *p is.
304
```
305
 
306
## I have a huge mock class, and Microsoft Visual C++ runs out of memory when compiling it.  What can I do? ##
307
 
308
We've noticed that when the `/clr` compiler flag is used, Visual C++
309
uses 5~6 times as much memory when compiling a mock class.  We suggest
310
to avoid `/clr` when compiling native C++ mocks.
311
 
312
## I can't figure out why Google Mock thinks my expectations are not satisfied.  What should I do? ##
313
 
314
You might want to run your test with
315
`--gmock_verbose=info`.  This flag lets Google Mock print a trace
316
of every mock function call it receives.  By studying the trace,
317
you'll gain insights on why the expectations you set are not met.
318
 
319
## How can I assert that a function is NEVER called? ##
320
 
321
```
322
EXPECT_CALL(foo, Bar(_))
323
    .Times(0);
324
```
325
 
326
## I have a failed test where Google Mock tells me TWICE that a particular expectation is not satisfied.  Isn't this redundant? ##
327
 
328
When Google Mock detects a failure, it prints relevant information
329
(the mock function arguments, the state of relevant expectations, and
330
etc) to help the user debug.  If another failure is detected, Google
331
Mock will do the same, including printing the state of relevant
332
expectations.
333
 
334
Sometimes an expectation's state didn't change between two failures,
335
and you'll see the same description of the state twice.  They are
336
however _not_ redundant, as they refer to _different points in time_.
337
The fact they are the same _is_ interesting information.
338
 
339
## I get a heap check failure when using a mock object, but using a real object is fine.  What can be wrong? ##
340
 
341
Does the class (hopefully a pure interface) you are mocking have a
342
virtual destructor?
343
 
344
Whenever you derive from a base class, make sure its destructor is
345
virtual.  Otherwise Bad Things will happen.  Consider the following
346
code:
347
 
348
```
349
class Base {
350
 public:
351
  // Not virtual, but should be.
352
  ~Base() { ... }
353
  ...
354
};
355
 
356
class Derived : public Base {
357
 public:
358
  ...
359
 private:
360
  std::string value_;
361
};
362
 
363
...
364
  Base* p = new Derived;
365
  ...
366
  delete p;  // Surprise! ~Base() will be called, but ~Derived() will not
367
             // - value_ is leaked.
368
```
369
 
370
By changing `~Base()` to virtual, `~Derived()` will be correctly
371
called when `delete p` is executed, and the heap checker
372
will be happy.
373
 
374
## The "newer expectations override older ones" rule makes writing expectations awkward.  Why does Google Mock do that? ##
375
 
376
When people complain about this, often they are referring to code like:
377
 
378
```
379
// foo.Bar() should be called twice, return 1 the first time, and return
380
// 2 the second time.  However, I have to write the expectations in the
381
// reverse order.  This sucks big time!!!
382
EXPECT_CALL(foo, Bar())
383
    .WillOnce(Return(2))
384
    .RetiresOnSaturation();
385
EXPECT_CALL(foo, Bar())
386
    .WillOnce(Return(1))
387
    .RetiresOnSaturation();
388
```
389
 
390
The problem is that they didn't pick the **best** way to express the test's
391
intent.
392
 
393
By default, expectations don't have to be matched in _any_ particular
394
order.  If you want them to match in a certain order, you need to be
395
explicit.  This is Google Mock's (and jMock's) fundamental philosophy: it's
396
easy to accidentally over-specify your tests, and we want to make it
397
harder to do so.
398
 
399
There are two better ways to write the test spec.  You could either
400
put the expectations in sequence:
401
 
402
```
403
// foo.Bar() should be called twice, return 1 the first time, and return
404
// 2 the second time.  Using a sequence, we can write the expectations
405
// in their natural order.
406
{
407
  InSequence s;
408
  EXPECT_CALL(foo, Bar())
409
      .WillOnce(Return(1))
410
      .RetiresOnSaturation();
411
  EXPECT_CALL(foo, Bar())
412
      .WillOnce(Return(2))
413
      .RetiresOnSaturation();
414
}
415
```
416
 
417
or you can put the sequence of actions in the same expectation:
418
 
419
```
420
// foo.Bar() should be called twice, return 1 the first time, and return
421
// 2 the second time.
422
EXPECT_CALL(foo, Bar())
423
    .WillOnce(Return(1))
424
    .WillOnce(Return(2))
425
    .RetiresOnSaturation();
426
```
427
 
428
Back to the original questions: why does Google Mock search the
429
expectations (and `ON_CALL`s) from back to front?  Because this
430
allows a user to set up a mock's behavior for the common case early
431
(e.g. in the mock's constructor or the test fixture's set-up phase)
432
and customize it with more specific rules later.  If Google Mock
433
searches from front to back, this very useful pattern won't be
434
possible.
435
 
436
## Google Mock prints a warning when a function without EXPECT\_CALL is called, even if I have set its behavior using ON\_CALL.  Would it be reasonable not to show the warning in this case? ##
437
 
438
When choosing between being neat and being safe, we lean toward the
439
latter.  So the answer is that we think it's better to show the
440
warning.
441
 
442
Often people write `ON_CALL`s in the mock object's
443
constructor or `SetUp()`, as the default behavior rarely changes from
444
test to test.  Then in the test body they set the expectations, which
445
are often different for each test.  Having an `ON_CALL` in the set-up
446
part of a test doesn't mean that the calls are expected.  If there's
447
no `EXPECT_CALL` and the method is called, it's possibly an error.  If
448
we quietly let the call go through without notifying the user, bugs
449
may creep in unnoticed.
450
 
451
If, however, you are sure that the calls are OK, you can write
452
 
453
```
454
EXPECT_CALL(foo, Bar(_))
455
    .WillRepeatedly(...);
456
```
457
 
458
instead of
459
 
460
```
461
ON_CALL(foo, Bar(_))
462
    .WillByDefault(...);
463
```
464
 
465
This tells Google Mock that you do expect the calls and no warning should be
466
printed.
467
 
468
Also, you can control the verbosity using the `--gmock_verbose` flag.
469
If you find the output too noisy when debugging, just choose a less
470
verbose level.
471
 
472
## How can I delete the mock function's argument in an action? ##
473
 
474
If you find yourself needing to perform some action that's not
475
supported by Google Mock directly, remember that you can define your own
476
actions using
477
[MakeAction()](CookBook.md#writing-new-actions) or
478
[MakePolymorphicAction()](CookBook.md#writing_new_polymorphic_actions),
479
or you can write a stub function and invoke it using
480
[Invoke()](CookBook.md#using-functions_methods_functors).
481
 
482
## MOCK\_METHODn()'s second argument looks funny.  Why don't you use the MOCK\_METHODn(Method, return\_type, arg\_1, ..., arg\_n) syntax? ##
483
 
484
What?!  I think it's beautiful. :-)
485
 
486
While which syntax looks more natural is a subjective matter to some
487
extent, Google Mock's syntax was chosen for several practical advantages it
488
has.
489
 
490
Try to mock a function that takes a map as an argument:
491
```
492
virtual int GetSize(const map& m);
493
```
494
 
495
Using the proposed syntax, it would be:
496
```
497
MOCK_METHOD1(GetSize, int, const map& m);
498
```
499
 
500
Guess what?  You'll get a compiler error as the compiler thinks that
501
`const map& m` are **two**, not one, arguments. To work
502
around this you can use `typedef` to give the map type a name, but
503
that gets in the way of your work.  Google Mock's syntax avoids this
504
problem as the function's argument types are protected inside a pair
505
of parentheses:
506
```
507
// This compiles fine.
508
MOCK_METHOD1(GetSize, int(const map& m));
509
```
510
 
511
You still need a `typedef` if the return type contains an unprotected
512
comma, but that's much rarer.
513
 
514
Other advantages include:
515
  1. `MOCK_METHOD1(Foo, int, bool)` can leave a reader wonder whether the method returns `int` or `bool`, while there won't be such confusion using Google Mock's syntax.
516
  1. The way Google Mock describes a function type is nothing new, although many people may not be familiar with it.  The same syntax was used in C, and the `function` library in `tr1` uses this syntax extensively.  Since `tr1` will become a part of the new version of STL, we feel very comfortable to be consistent with it.
517
  1. The function type syntax is also used in other parts of Google Mock's API (e.g. the action interface) in order to make the implementation tractable. A user needs to learn it anyway in order to utilize Google Mock's more advanced features.  We'd as well stick to the same syntax in `MOCK_METHOD*`!
518
 
519
## My code calls a static/global function.  Can I mock it? ##
520
 
521
You can, but you need to make some changes.
522
 
523
In general, if you find yourself needing to mock a static function,
524
it's a sign that your modules are too tightly coupled (and less
525
flexible, less reusable, less testable, etc).  You are probably better
526
off defining a small interface and call the function through that
527
interface, which then can be easily mocked.  It's a bit of work
528
initially, but usually pays for itself quickly.
529
 
530
This Google Testing Blog
531
[post](http://googletesting.blogspot.com/2008/06/defeat-static-cling.html)
532
says it excellently.  Check it out.
533
 
534
## My mock object needs to do complex stuff.  It's a lot of pain to specify the actions.  Google Mock sucks! ##
535
 
536
I know it's not a question, but you get an answer for free any way. :-)
537
 
538
With Google Mock, you can create mocks in C++ easily.  And people might be
539
tempted to use them everywhere. Sometimes they work great, and
540
sometimes you may find them, well, a pain to use. So, what's wrong in
541
the latter case?
542
 
543
When you write a test without using mocks, you exercise the code and
544
assert that it returns the correct value or that the system is in an
545
expected state.  This is sometimes called "state-based testing".
546
 
547
Mocks are great for what some call "interaction-based" testing:
548
instead of checking the system state at the very end, mock objects
549
verify that they are invoked the right way and report an error as soon
550
as it arises, giving you a handle on the precise context in which the
551
error was triggered.  This is often more effective and economical to
552
do than state-based testing.
553
 
554
If you are doing state-based testing and using a test double just to
555
simulate the real object, you are probably better off using a fake.
556
Using a mock in this case causes pain, as it's not a strong point for
557
mocks to perform complex actions.  If you experience this and think
558
that mocks suck, you are just not using the right tool for your
559
problem. Or, you might be trying to solve the wrong problem. :-)
560
 
561
## I got a warning "Uninteresting function call encountered - default action taken.."  Should I panic? ##
562
 
563
By all means, NO!  It's just an FYI.
564
 
565
What it means is that you have a mock function, you haven't set any
566
expectations on it (by Google Mock's rule this means that you are not
567
interested in calls to this function and therefore it can be called
568
any number of times), and it is called.  That's OK - you didn't say
569
it's not OK to call the function!
570
 
571
What if you actually meant to disallow this function to be called, but
572
forgot to write `EXPECT_CALL(foo, Bar()).Times(0)`?  While
573
one can argue that it's the user's fault, Google Mock tries to be nice and
574
prints you a note.
575
 
576
So, when you see the message and believe that there shouldn't be any
577
uninteresting calls, you should investigate what's going on.  To make
578
your life easier, Google Mock prints the function name and arguments
579
when an uninteresting call is encountered.
580
 
581
## I want to define a custom action.  Should I use Invoke() or implement the action interface? ##
582
 
583
Either way is fine - you want to choose the one that's more convenient
584
for your circumstance.
585
 
586
Usually, if your action is for a particular function type, defining it
587
using `Invoke()` should be easier; if your action can be used in
588
functions of different types (e.g. if you are defining
589
`Return(value)`), `MakePolymorphicAction()` is
590
easiest.  Sometimes you want precise control on what types of
591
functions the action can be used in, and implementing
592
`ActionInterface` is the way to go here. See the implementation of
593
`Return()` in `include/gmock/gmock-actions.h` for an example.
594
 
595
## I'm using the set-argument-pointee action, and the compiler complains about "conflicting return type specified".  What does it mean? ##
596
 
597
You got this error as Google Mock has no idea what value it should return
598
when the mock method is called.  `SetArgPointee()` says what the
599
side effect is, but doesn't say what the return value should be.  You
600
need `DoAll()` to chain a `SetArgPointee()` with a `Return()`.
601
 
602
See this [recipe](CookBook.md#mocking_side_effects) for more details and an example.
603
 
604
 
605
## My question is not in your FAQ! ##
606
 
607
If you cannot find the answer to your question in this FAQ, there are
608
some other resources you can use:
609
 
610
  1. read other [documentation](Documentation.md),
611
  1. search the mailing list [archive](http://groups.google.com/group/googlemock/topics),
612
  1. ask it on [googlemock@googlegroups.com](mailto:googlemock@googlegroups.com) and someone will answer it (to prevent spam, we require you to join the [discussion group](http://groups.google.com/group/googlemock) before you can post.).
613
 
614
Please note that creating an issue in the
615
[issue tracker](https://github.com/google/googletest/issues) is _not_
616
a good way to get your answer, as it is monitored infrequently by a
617
very small number of people.
618
 
619
When asking a question, it's helpful to provide as much of the
620
following information as possible (people cannot help you if there's
621
not enough information in your question):
622
 
623
  * the version (or the revision number if you check out from SVN directly) of Google Mock you use (Google Mock is under active development, so it's possible that your problem has been solved in a later version),
624
  * your operating system,
625
  * the name and version of your compiler,
626
  * the complete command line flags you give to your compiler,
627
  * the complete compiler error messages (if the question is about compilation),
628
  * the _actual_ code (ideally, a minimal but complete program) that has the problem you encounter.

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.