模拟单元测试用例所需的类更改

时间:2017-11-27 10:23:21

标签: c++ gmock

我们有一个具有实现线程的方法的类:

class ThreadPool
{
//Thread creation and invocation
int Create();
};

另一个在其中嵌入ThreadPool的类

class Service
{
public:
ThreadPool mThreadPool;
int start();
}

int Service::start()
{
mThreadPoll.Create();
.......
}

上述设计模式的原因我无法模拟我的Service类。

我正在尝试为ThreadPool编写一个接口类,并在Service类中使用它:

class InterfaceThreadPool
{
virtual int Create () = 0;
};

class ThreadPool : public InterfaceThreadPool
{
int Create () override;
};

我的想法是创建一个接口类ThreadPoolImpl,我可以在我的服务类中使用它:

class Service : public ThreadPoolImpl  
{
public:
int start();
}
int Service::start()
{
Create(); // as inherited from ThreadPoolImpl  
.......
}

好处是现在我可以模拟我的Service类。但我无法定义ThreadPoolImpl类

class ThreadPoolImpl : public InterfaceThreadPool
{
int Create () override;
}
int ThreadPoolImpl::Create()
{
//how can I call ThreadPool Create
}

1 个答案:

答案 0 :(得分:0)

我实际上不同意@ Jarod42的评论。如果您想测试并模拟ThreadPool课程和Service课程,那么最简单的方法就是设计它:

class InterfaceThreadPool
{
public:
    virtual ~InterfaceThreadPool() = default;
    virtual int Create () = 0;
};

class ThreadPool : public InterfaceThreadPool
{
public:
    ~ThreadPool() override;
    int Create () override;
};

class IService
{
public:
    virtual ~IService() = default;
    virtual int start() = 0;
};

class Service: public IService
{
public:
    /*
     * InterfaceThreadPool might be passed by raw ptr, reference, smart ptr, whataver you like the most
     */
    Service(InterfaceThreadPool* mThreadPool);
    ~Service() override;
    int start() override { return mThreadPool_->Create(); }
private:
    InterfaceThreadPool* mThreadPool_;
};

然后在您的生产代码中,您使用ServiceThreadPool的相应实现。在您的测试中,您可以使用:

  • MockThreadPool(源自InterfaceThreadPool)以测试Service
  • MockThreadPool + MockService(派生自IService)来测试其他需要这两个类的内容
  • 调用MockService函数时调用
  • ThreadPool + start实现(它不常见,但也许你觉得它很有用)