Search code examples
googletestgooglemock

Testing simple function with Gmock - test fails(should pass?)


I just started using Gtest/Gmocks and I'm struggling with an example. I have a simple class which has a member a function that returns a value(say 3). I'm trying to mock this test and check if the returned result is 3. For simplicity I wrote everything in a single file:

// Testing.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "gmock\gmock.h"
#include "gtest\gtest.h"
using ::testing::AtLeast;
using namespace std;

class MyClass{
public:
    virtual int retValue() { return 3; } 
    virtual ~MyClass(){}
};


class FakeMyClass : public MyClass
{
public:
    MOCK_METHOD0( retValue, int() );
};

TEST(TestForMyClass, TestRetVal)
{
    FakeMyClass obj3;
    EXPECT_EQ(obj3.retValue(), 3);
}

int _tmain(int argc, _TCHAR* argv[])
{
    ::testing::InitGoogleMock(&argc, argv);
    return RUN_ALL_TESTS();
}

However my test fails and it says that expected result is 3 and my actual result is 0. I've watched a couple of examples and I think I did everything as shown in there still the result is not what I'm expecting. Please help me see where I'm wrong and how can I make that test to pass. Thank you.


Solution

  • The simple answer to your question is: You have an object of your mock FakeMyClass. This object will never return the value of the base class, if you override this method!!

    If you want to test a simple method of a class, you do not need a mock. Just test your class:

    class MyClass{
    public:
      virtual int retValue() { return 3; } 
      virtual ~MyClass(){}
    };
    
    TEST(TestForMyClass, TestRetVal)
    {
      MyClass obj3;
      EXPECT_EQ(obj3.retValue(), 3);
    }
    

    Little bit more to mocking:
    A principle of testing is to test in isolation. So, when your class is in a relation to another object, you have to mock this object. I suggest to take a look on an example (e.g. klick).
    In this example the Painter is the system under test. The Paintercommunicates with the Turtle, which is mocked.