Showing posts with label check parameter type. Show all posts
Showing posts with label check parameter type. Show all posts

Wednesday, May 8, 2013

Google Test check for derived class pointer

I have a function that creates an object of a derived/child Derived class and passes this object as a pointer to a function accepting a pointer of the base/parent Base class.

Now I wanted to test this using the Google Test Framework in conjunction with Google Mock:

TEST_F(myClassToBeTestedTest, functionToBeTestedTest)
{
    EXPECT_CALL(myClassMock, myFunc(::testing::A<Derived *>()));
    myClassToBeTested.functionToBeTested();
}


This did not compile with the following error:

mytestclasstest.cpp:X:Y: error: no matching function for call to 'MyClassMock::gmock_myFunc(testing::Matcher<Derived*>)'
mytestclasstest.cpp:X:Y: note: candidate is:
myclassmock.h:X:Y: note: testing::internal::MockSpec<void(Base*)>& 'MyClassMock::gmock_myFunc(const testing::Matcher<Base*>&)

...

Googling a bit I found http://stackoverflow.com/questions/5056538/google-mock-using-testingan which explained that Google Test needed const and &. However I couldn't get this to make sense for my type argument. E.g. EXPECT_CALL(myClassMock, myFunc(const ::testing::A<Derived *>() &)); doesn't work.

After more searching (and annoyance at google for removing :: and <>) I ended up with creating my own custom matcher using "Using Predicates as Matchers" from http://code.google.com/p/googlemock/wiki/CookBook#Using_Predicates_as_Matchers together with http://stackoverflow.com/questions/500493/c-equivalent-of-instanceof to check if object is type of Derived:

int IsDerived(Base * base)
{
    Derived * derived = dynamic_cast<Derived *>(base);
    return derived != NULL ? 1 : 0;
}

TEST_F(myClassToBeTestedTest, functionToBeTestedTest)
{
    EXPECT_CALL(myClassMock, myFunc(::testing::Truly(IsDerived)));
    myClassToBeTested.functionToBeTested();
}