Project: VoltDB (App Definition and Development / Database)
File: FrequentlyAskedQuestions.md

Please send your questions to the discussion group. If you need help with compiler errors, make sure you have tried first. In order for a method to be mocked, it must be virtual, unless you use the . After version 1.4.0 of Google Mock was released, we had an idea on how to make it easier to write matchers that can generate informative messages efficiently. We experimented with this idea and liked what we saw. Therefore we decided to implement it. Unfortunately, this means that if you have defined your own matchers by implementing `MatcherInterface` or using `MakePolymorphicMatcher()`, your definitions will no longer compile. Matchers defined using the `MATCHER*` family of macros are not affected. Sorry for the hassle if your matchers are affected. We believe it's in everyone's long-term interest to make this change sooner than later. Fortunately, it's usually not hard to migrate an existing matcher to the new API. Here's what you need to do: If you wrote your matcher like this: ```cpp // Old matcher definition that doesn't work with the latest // Google Mock. using ::testing::MatcherInterface; ... class MyWonderfulMatcher : public MatcherInterface<MyType> { public: ... virtual bool Matches(MyType value) const { // Returns true if value matches. return value.GetFoo() > 5; } ... }; ``` you'll need to change it to: ```cpp // New matcher definition that works with the latest Google Mock. using ::testing::MatcherInterface; using ::testing::MatchResultListener; ... class MyWonderfulMatcher : public MatcherInterface<MyType> { public: ... virtual bool MatchAndExplain(MyType value, MatchResultListener* listener) const { // Returns true if value matches. return value.GetFoo() > 5; } ... }; ``` (i.e. rename `Matches()` to `MatchAndExplain()` and give it a second argument of type `MatchResultListener*`.) If you were also using `ExplainMatchResultTo()` to improve the matcher message: ```cpp // Old matcher definition that doesn't work with the lastest // Google Mock. using ::testing::MatcherInterface; ... class MyWonderfulMatcher : public MatcherInterface<MyType> { public: ... virtual bool Matches(MyType value) const { // Returns true if value matches. return value.GetFoo() > 5; } virtual void ExplainMatchResultTo(MyType value, ::std::ostream* os) const { // Prints some helpful information to os to help // a user understand why value matches (or doesn't match). *os << "the Foo property is " << value.GetFoo(); } ... }; ``` you should move the logic of `ExplainMatchResultTo()` into `MatchAndExplain()`, using the `MatchResultListener` argument where the `::std::ostream` was used: ```cpp // New matcher definition that works with the latest Google Mock. using ::testing::MatcherInterface; using ::testing::MatchResultListener; ... class MyWonderfulMatcher : public MatcherInterface<MyType> { public: ... virtual bool MatchAndExplain(MyType value, MatchResultListener* listener) const { // Returns true if value matches. *listener << "the Foo property is " << value.GetFoo(); return value.GetFoo() > 5; } ... }; ``` If your matcher is defined using `MakePolymorphicMatcher()`: ```cpp // Old matcher definition that doesn't work with the latest // Google Mock. using ::testing::MakePolymorphicMatcher; ... class MyGreatMatcher { public: ... bool Matches(MyType value) const { // Returns true if value matches. return value.GetBar() < 42; } ... }; ... MakePolymorphicMatcher(MyGreatMatcher())

``` you should rename the `Matches()` method to `MatchAndExplain()` and add a `MatchResultListener*` argument (the same as what you need to do for matchers defined by implementing `MatcherInterface`): ```cpp // New matcher definition that works with the latest Google Mock. using ::testing::MakePolymorphicMatcher; using ::testing::MatchResultListener; ... class MyGreatMatcher { public: ... bool MatchAndExplain(MyType value, MatchResultListener* listener) const { // Returns true if value matches. return value.GetBar() < 42; } ... }; ... MakePolymorphicMatcher(MyGreatMatcher()) ... ``` If your polymorphic matcher uses `ExplainMatchResultTo()` for better failure messages: ```cpp // Old matcher definition that doesn't work with the latest // Google Mock. using ::testing::MakePolymorphicMatcher; ... class MyGreatMatcher { public: ... bool Matches(MyType value) const { // Returns true if value matches. return value.GetBar() < 42; } ... }; void ExplainMatchResultTo(const MyGreatMatcher& matcher, MyType value, ::std::ostream* os) { // Prints some helpful information to os to help // a user understand why value matches (or doesn't match). *os << "the Bar property is " << value.GetBar(); } ... MakePolymorphicMatcher(MyGreatMatcher()) ... ``` you'll need to move the logic inside `ExplainMatchResultTo()` to `MatchAndExplain()`: ```cpp // New matcher definition that works with the latest Google Mock. using ::testing::MakePolymorphicMatcher; using ::testing::MatchResultListener; ... class MyGreatMatcher { public: ... bool MatchAndExplain(MyType value, MatchResultListener* listener) const { // Returns true if value matches. *listener << "the Bar property is " << value.GetBar(); return value.GetBar() < 42; } ... }; ... MakePolymorphicMatcher(MyGreatMatcher()) ... ``` For more information, you can read these from the cookbook. As always, you are welcome to post questions on `googlemock@googlegroups.com` if you need any help. Google Mock works out of the box with Google Test. However, it's easy to configure it to work with any testing framework of your choice. is how. If you are confused by the compiler errors gcc threw at you, try consulting the Google Mock Doctor tool first. What it does is to scan stdin for gcc error messages, and spit out diagnoses on the problems (we call them diseases) your code has. To "install", run command: ``` alias gmd='<path to googlemock>/scripts/gmock_doctor.py' ``` To use it, do: ``` <your-favorite-build-command> <your-test> 2>&1 | gmd ``` For example: ``` make my_test 2>&1 | gmd ``` Or you can run `gmd` and copy-n-paste gcc's error messages to it. You cannot mock a variadic function (i.e. a function taking ellipsis (`...`) arguments) directly in Google Mock. The problem is that in general, there is no way for a mock object to know how many arguments are passed to the variadic method, and what the arguments' types are. Only the author of the base class knows the protocol, and we cannot look into their head. Therefore, to mock such a function, the user must teach the mock object how to figure out the number of arguments and their types. One way to do it is to provide overloaded versions of the function. Ellipsis arguments are inherited from C and not really a C++ feature. They are unsafe to use and don't work with arguments that have constructors or destructors. Therefore we recommend to avoid them in C++ as much as possible. If you compile this using Microsoft Visual C++ 2005 SP1: ```cpp class Foo { ... virtual void Bar(const int i) = 0; }; class MockFoo : public Foo {

MOCK_METHOD1(Bar, void(const int i)); }; ``` You may get the following warning: ``` warning C4301: 'MockFoo::Bar': overriding virtual function only differs from 'Foo::Bar' by const/volatile qualifier ``` This is a MSVC bug. The same code compiles fine with gcc ,for example. If you use Visual C++ 2008 SP1, you would get the warning: ``` 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 ``` In C++, if you declare a function with a `const` parameter, the `const` modifier is ignored. Therefore, the `Foo` base class above is equivalent to: ```cpp class Foo { ... virtual void Bar(int i) = 0; // int or const int? Makes no difference. }; ``` In fact, you can declare Bar() with an `int` parameter, and define it with a `const int` parameter. The compiler will still match them up. Since making a parameter `const` is meaningless in the method declaration, we recommend to remove it in both `Foo` and `MockFoo`. That should workaround the VC bug. Note that we are talking about the top-level `const` modifier here. If the function parameter is passed by pointer or reference, declaring the pointee or referee as `const` is still meaningful. For example, the following two declarations are not equivalent: ```cpp void Bar(int p); // Neither p nor p is const. void Bar(const int p); // p is not const, but p is. ``` We've noticed that when the `/clr` compiler flag is used, Visual C++ uses 5~6 times as much memory when compiling a mock class. We suggest to avoid `/clr` when compiling native C++ mocks. You might want to run your test with `--gmock_verbose=info`. This flag lets Google Mock print a trace of every mock function call it receives. By studying the trace, you'll gain insights on why the expectations you set are not met. ```cpp EXPECTCALL(foo, Bar()) .Times(0); ``` When Google Mock detects a failure, it prints relevant information (the mock function arguments, the state of relevant expectations, and etc) to help the user debug. If another failure is detected, Google Mock will do the same, including printing the state of relevant expectations. Sometimes an expectation's state didn't change between two failures, and you'll see the same description of the state twice. They are however not redundant, as they refer to different points in time. The fact they are the same is interesting information. Does the class (hopefully a pure interface) you are mocking have a virtual destructor? Whenever you derive from a base class, make sure its destructor is virtual. Otherwise Bad Things will happen. Consider the following code: ```cpp class Base { public: // Not virtual, but should be. ~Base() { ... } ... }; class Derived : public Base { public: ... private: std::string value_; }; ... Base* p = new Derived; ... delete p; // Surprise! ~Base() will be called, but ~Derived() will not // - value_ is leaked. ``` By changing `~Base()` to virtual, `~Derived()` will be correctly called when `delete p` is executed, and the heap checker will be happy. When people complain about this, often they are referring to code like: ```cpp //

should be called twice, return 1 the first time, and return // 2 the second time. However, I have to write the expectations in the // reverse order. This sucks big time!!! EXPECT_CALL(foo, Bar()) .WillOnce(Return(2)) .RetiresOnSaturation(); EXPECT_CALL(foo, Bar()) .WillOnce(Return(1)) .RetiresOnSaturation(); ``` The problem is that they didn't pick the best way to express the test's intent. By default, expectations don't have to be matched in any particular order. If you want them to match in a certain order, you need to be explicit. This is Google Mock's (and jMock's) fundamental philosophy: it's easy to accidentally over-specify your tests, and we want to make it harder to do so. There are two better ways to write the test spec. You could either put the expectations in sequence: ```cpp // foo.Bar() should be called twice, return 1 the first time, and return // 2 the second time. Using a sequence, we can write the expectations // in their natural order. { InSequence s; EXPECT_CALL(foo, Bar()) .WillOnce(Return(1)) .RetiresOnSaturation(); EXPECT_CALL(foo, Bar()) .WillOnce(Return(2)) .RetiresOnSaturation(); } ``` or you can put the sequence of actions in the same expectation: ```cpp // foo.Bar() should be called twice, return 1 the first time, and return // 2 the second time. EXPECT_CALL(foo, Bar()) .WillOnce(Return(1)) .WillOnce(Return(2)) .RetiresOnSaturation(); ``` Back to the original questions: why does Google Mock search the expectations (and `ON_CALL`s) from back to front? Because this allows a user to set up a mock's behavior for the common case early (e.g. in the mock's constructor or the test fixture's set-up phase) and customize it with more specific rules later. If Google Mock searches from front to back, this very useful pattern won't be possible. When choosing between being neat and being safe, we lean toward the latter. So the answer is that we think it's better to show the warning. Often people write `ON_CALL`s in the mock object's constructor or `SetUp()`, as the default behavior rarely changes from test to test. Then in the test body they set the expectations, which are often different for each test. Having an `ON_CALL` in the set-up part of a test doesn't mean that the calls are expected. If there's no `EXPECT_CALL` and the method is called, it's possibly an error. If we quietly let the call go through without notifying the user, bugs may creep in unnoticed. If, however, you are sure that the calls are OK, you can write ```cpp EXPECTCALL(foo, Bar()) .WillRepeatedly(...); ``` instead of ```cpp ONCALL(foo, Bar()) .WillByDefault(...); ``` This tells Google Mock that you do expect the calls and no warning should be printed. Also, you can control the verbosity using the `--gmock_verbose` flag. If you find the output too noisy when debugging, just choose a less verbose level. If you find yourself needing to perform some action that's not supported by Google Mock directly, remember that you can define your own actions using or , or you can write a stub function and invoke it using . What?! I think it's beautiful. :-) While which syntax looks more natural is a subjective matter to some extent, Google Mock's syntax was chosen for several practical advantages it

Try to mock a function that takes a map as an argument: ```cpp virtual int GetSize(const map<int, std::string>& m); ``` Using the proposed syntax, it would be: ```cpp MOCK_METHOD1(GetSize, int, const map<int, std::string>& m); ``` Guess what? You'll get a compiler error as the compiler thinks that `const map<int, std::string>& m` are two, not one, arguments. To work around this you can use `typedef` to give the map type a name, but that gets in the way of your work. Google Mock's syntax avoids this problem as the function's argument types are protected inside a pair of parentheses: ```cpp // This compiles fine. MOCK_METHOD1(GetSize, int(const map<int, std::string>& m)); ``` You still need a `typedef` if the return type contains an unprotected comma, but that's much rarer. Other advantages include: `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. 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. 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*`! You can, but you need to make some changes. In general, if you find yourself needing to mock a static function, it's a sign that your modules are too tightly coupled (and less flexible, less reusable, less testable, etc). You are probably better off defining a small interface and call the function through that interface, which then can be easily mocked. It's a bit of work initially, but usually pays for itself quickly. This Google Testing Blog says it excellently. Check it out. I know it's not a question, but you get an answer for free any way. :-) With Google Mock, you can create mocks in C++ easily. And people might be tempted to use them everywhere. Sometimes they work great, and sometimes you may find them, well, a pain to use. So, what's wrong in the latter case? When you write a test without using mocks, you exercise the code and assert that it returns the correct value or that the system is in an expected state. This is sometimes called "state-based testing". Mocks are great for what some call "interaction-based" testing: instead of checking the system state at the very end, mock objects verify that they are invoked the right way and report an error as soon as it arises, giving you a handle on the precise context in which the error was triggered. This is often more effective and economical to do than state-based testing. If you are doing state-based testing and using a test double just to simulate the real object, you are probably better off using a

Using a mock in this case causes pain, as it's not a strong point for mocks to perform complex actions. If you experience this and think that mocks suck, you are just not using the right tool for your problem. Or, you might be trying to solve the wrong problem. :-) By all means, NO! It's just an FYI. What it means is that you have a mock function, you haven't set any expectations on it (by Google Mock's rule this means that you are not interested in calls to this function and therefore it can be called any number of times), and it is called. That's OK - you didn't say it's not OK to call the function! What if you actually meant to disallow this function to be called, but forgot to write `EXPECT_CALL(foo, Bar()).Times(0)`? While one can argue that it's the user's fault, Google Mock tries to be nice and prints you a note. So, when you see the message and believe that there shouldn't be any uninteresting calls, you should investigate what's going on. To make your life easier, Google Mock prints the function name and arguments when an uninteresting call is encountered. Either way is fine - you want to choose the one that's more convenient for your circumstance. Usually, if your action is for a particular function type, defining it using `Invoke()` should be easier; if your action can be used in functions of different types (e.g. if you are defining `Return(value)`), `MakePolymorphicAction()` is easiest. Sometimes you want precise control on what types of functions the action can be used in, and implementing `ActionInterface` is the way to go here. See the implementation of `Return()` in `include/gmock/gmock-actions.h` for an example. You got this error as Google Mock has no idea what value it should return when the mock method is called. `SetArgPointee()` says what the side effect is, but doesn't say what the return value should be. You need `DoAll()` to chain a `SetArgPointee()` with a `Return()`. See this for more details and an example. If you cannot find the answer to your question in this FAQ, there are some other resources you can use: search the mailing list , ask it on and someone will answer it (to prevent spam, we require you to join the before you can post.). Please note that creating an issue in the is not a good way to get your answer, as it is monitored infrequently by a very small number of people. When asking a question, it's helpful to provide as much of the following information as possible (people cannot help you if there's not enough information in your question): 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), your operating system, the name and version of your compiler, the complete command line flags you give to your compiler, the complete compiler error messages (if the question is about compilation), the actual code (ideally, a minimal but complete program) that has the problem you encounter.