C++ Automatic Mocks Injector
C++ Automatic Mocks Injector is C++14 header only library providing following functionality:
- Automatically create required mocks
 - Automatically inject mocks to tested classes via constructor
 - Automatically register for required destructor's in case of smart pointers (supports testing of unique_ptr)
 - Uses HippoMocks as Mocking library
 - Uses DI as Dependency Injection library
 
#include <string>
#include <memory>
#include <utility>
struct ilogger { virtual ~ilogger() { }; virtual void log(const std::string&) = 0; };
struct ilogic { virtual ~ilogic() { }; virtual void do_it() = 0; };
class example {
public:
    example(const std::shared_ptr<ilogger>& logger
          , std::unique_ptr<ilogic> logic
          , const std::string& text)
        : logger_(logger)
        , logic_(std::move(logic))
        , text_(text)
    { }
    int run() {
        logic_->do_it();
        logger_->log(text_);
        return 0;
    }
private:
    std::shared_ptr<ilogger> logger_;
    std::unique_ptr<ilogic> logic_;
    std::string text_;
};
#include <mocks_injector.hpp>
int main() {
    namespace di = boost::di;
    //1. create mocks injector and example class
    auto _ = di::make_injector<di::mocks_provider>();
    //2. set up expectations
    EXPECT_CALL(_, ilogic::do_it);
    EXPECT_CALL(_, ilogger::log).With("hello world");
    //3. run tests
    example sut{_, _, "hello world"};
    assert(0 == sut.run());
}struct logic : ilogic { void do_it() override { } };
class app {
public:
    app(std::shared_ptr<example> e)
        : example_(e)
    { }
    int run() {
        return example_->run();
    }
private:
    std::shared_ptr<example> example_;
};
#include <mocks_injector.hpp>
int main() {
    namespace di = boost::di;
    //1. create mocks injector with dependencies
    auto mi = di::make_injector<di::mocks_provider>(
        di::bind<std::string>.to("hello world")
      , di::bind<ilogic, logic> // inject real logic
    );
    //2. set up expectations
    EXPECT_CALL(mi, ilogger::log).With("hello world");
    //3. create example class and run it
    assert(!mi.create<app>().run());
}Distributed under the Boost Software License, Version 1.0.