Matching arguments of custom type in googlemock
Asked Answered
S

1

9

I have a problem matching a function argument to a specific object using google mock.

Consider the following code:

class Foo
{
public:
    struct Bar
    {
        int foobar;
    }

    void myMethod(const Bar& bar);
}

Now I have some testing code, it could look like this:

Foo::Bar bar;
EXPECT_CALL(fooMock, myMethod(Eq(bar));

So I want to make sure that when Foo::myMethod is called, the argument looks like my locally instantiated bar object.

When I try this approach I get an error message like:

gmock/gmock-matchers.h(738): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const Foo::Bar' (or there is no acceptable conversion)

I tried playing around with defining operator == and != (at least == both as member of free function), using Eq(ByRef(bar)) but I could not fix the issue. The only thing that helps is using

Field(&Foo::Bar::foobar, x) 

but this way I have to check every field in my struct which seems like a lot of typing work...

Swede answered 21/6, 2013 at 10:13 Comment(4)
I never had problems with properly defined operator== as free functions. Did you get the signatures right?Interferometer
Please post your operator== definition and error message you got.Fleabitten
bool operator==(const Foo::Bar& first, const Foo::Bar& second)Swede
D'oh! I declared my nice operator== in an anonymous namespace. For some reasons I don't get the compiler couldn't it find it. When defining the function outside the namespace everything works just fine... So err, if someone would like an easy A, just post the 'define operator==' and I'll tag it as answer...Swede
S
8

Ok, then I'll answer to myself:

You have to provide an operator== implementation for Foo::Bar:

bool operator==(const Foo::Bar& first, const Foo::Bar& second)
{
    ...
}

Don't add it as member function to Foo::Bar but use a free function.

And, lessons learned, be careful to NOT put them into an anonymous namespace.

Swede answered 21/6, 2013 at 12:56 Comment(2)
Do you mean "to not put them into an anonymous namespace"?Ictinus
It has to be in the same namespace Foo is in.Brader

© 2022 - 2024 — McMap. All rights reserved.