我们有一个具有实现线程的方法的类:
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
}
答案 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_;
};
然后在您的生产代码中,您使用Service
和ThreadPool
的相应实现。在您的测试中,您可以使用:
MockThreadPool
(源自InterfaceThreadPool
)以测试Service
MockThreadPool
+ MockService
(派生自IService
)来测试其他需要这两个类的内容MockService
函数时调用ThreadPool
+ start
实现(它不常见,但也许你觉得它很有用)