Search code examples
c++googlemock

How to access protected members


I have a MockAlgoController class which has protected inheritance of ControllerMockParams. How to access these protected fields outside, i.e. when asserting in tests?

struct ControllerMockParams
{
    int numCtx{0};
    MockAlgo firstAlgo{Interface::first, numCtx};
    MockAlgo secondAlgo{Interface::second, numCtx};
}


class MockAlgoController : protected ControllerMockParams, public AlgoController
{
public:
    MockAlgoController()
        : AlgoController(
              ControllerMockParams::firstAlgo,
              ControllerMockParams::secondAlgo)
    {
    }
    MOCK_METHOD0(foo(), void());
// (...)

}

How do I expose the firstAlgo and secondAlgo so they are accessible outside, i.e. for assertion:

EXPECT_CALL(mockAlgoController.firstAlgo, bar()) // bar() is defined in MockAlgo class.

Solution

  • To access protected fields outside you must not use protected in the first place. So your code should be like:

    class MockAlgoController : public ControllerMockParams, public AlgoController
    {
    public:
        MockAlgoController()
            : AlgoController(
                  ControllerMockParams::firstAlgo,
                  ControllerMockParams::secondAlgo)
        {
        }
        MOCK_METHOD0(foo(), void());
    // (...)
    }
    

    When a class uses public member access specifier to derive from a base, all public members of the base class are accessible as public members of the derived class and all protected members of the base class are accessible as protected members of the derived class (private members of the base are never accessible unless friended)

    See documentation: https://en.cppreference.com/w/cpp/language/derived_class