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

Class changes required for mocking for Unit Test Cases

本文关键字:单位 测试用例 模拟      更新时间:2023-10-16

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

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

另一个嵌入螺纹池中的类

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

上述设计模式的原因我无法模拟我的服务课。

我正在尝试编写一个接口类以进行threadpool并在服务类中使用它:

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  
.......
}

好处是,现在我可以嘲笑我的服务课。但是我无法定义threadpoolimpl类

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

我实际上不同意 @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函数时调用实现(这不是很常见,但也许您可以发现它有用)