doc/CxxMockingStrategy

C++ mocking strategy

  • We don’t use any mocking library.
  • We implement mocking by splitting mockable code to protected virtual methods. Inside test suites, we create a subclass in which we override the methods we want to mock.
  • Best practices for the override:
    • Opt-in for mocking on a per-test basis.
    • When not opted-in, call the parent class’s method instead of duplicating its code.

Example:

class Greeter {
protected:
    virtual const char *name() {
        return "john";
    }

public:
    void greet() {
        std::cout << "hello " << name() << std::endl;
    }
};

// In the test suite:
class TestGreeter: public Greeter {
protected:
    virtual const char *name() override {
        if (mockName != nullptr) {
            return mockName;
        } else {
            return Greeter::name();
        }
    }

public:
    const char *mockName; // Set to non-nullptr to mock the name

    TestGreeter()
        : mockName(nullptr)
        { }
};