Google mock ByRef method

前端 未结 1 1841
梦谈多话
梦谈多话 2021-01-11 12:36

I have a class that takes a boolean as a reference parameter and returns an integer:

class Foo
{
  public:
    Bar my_bar;
    virtual int myMethod(bool &         


        
相关标签:
1条回答
  • 2021-01-11 13:27

    Your question is hard to get! The samples from google mocks 'cook book' are so as well.

    Do you want to reuse the implementation for Foo::myMethod() with you mock class, or do you just want to mock the side effects (return value and changed by ref parameters) for specific call situations?

    A mock class is usually meant to replace / simulate your Foo class, not to inherit it directly or it's behavior. Don't know if the way you define this 'default' behavior for a pure method will work, but doubt that. You might simply omit the = 0 then. The better approach would be to separate out a real interface declaration like:

    struct IFoo
    {
        virtual int myMethod(bool &my_boolean) = 0;
        virtual ~IFoo() {}
    };
    
    class Foo : public IFoo
    {
        // ...
    };
    
    class MockFoo : public IFoo
    {
       MOCK_METHOD1(myMethod,int(bool &my_boolean));
    };
    

    If you have the latter case, you should get off with testing::Return(value) and testing::SetArgReferee<N>(value) (found that in the very useful 'Cheat Sheet').

    Your expectation call should look like this then:

    MockFoo foo;
    
    // Expect call to myMethod() return -1 and set the by ref argument to true
    EXPECT_CALL(foo, myMethod(_))
      .WillOnce(DoAll(SetArgReferee<0>(true),Return(-1)));
    
    // Expect call to myMethod() return 0 and set the by ref argument to false
    EXPECT_CALL(foo, myMethod(_))
      .WillOnce(DoAll(SetArgReferee<0>(false),Return(0)));
    

    If you really want to reuse your original classes logic for myMethod() have a look at 'Delegating calls to a parent class', resp. 'Delegating Calls to a Real Object'

    0 讨论(0)
提交回复
热议问题