创建一个模拟C ++对象的接口

时间:2012-03-23 17:02:17

标签: c++ unit-testing boost interface

我有一个Visual Studio 2008 C ++项目,我正在为使用boost::asio::ip::udp::socket的类实现单元测试。为了获得单元可测试性,我需要能够传入该套接字对象的模拟。

我的问题是你不能拥有虚拟模板功能而且boost :: asio有一个非常模板化的用户界面。

如何为使用模板的C ++库创建一个模拟接口?

// socket interface that can be mocked
class IUDPSocket
{
public:
    virtual void open( const boost::asio::ip::udp& protocol ) = 0;

    // problem!
    template <typename SettableSocketOption>
    virtual void set_option( const SettableSocketOption& option ) = 0;

    virtual void bind( const boost::asio::ip::udp::endpoint& endpoint ) = 0;

    // Problem! 
    template <typename MutableBufferSequence, typename ReadHandler>
    virtual void async_receive_from( 
        const MutableBufferSequence& buffers,
        boost::asio::ip::udp::endpoint& sender_endpoint,
        ReadHandler handler ) = 0;

protected:
    virtual ~IUDPSocket() = 0;
};

// socket class that will be used for "normal" operation.
class BoostUDPSocket
{
    // ...

    virtual void open( const boost::asio::ip::udp& protocol )
    {
        socket_.open( protocol );
    };

private:
    boost::asio::ip::udp::socket socket_;
}; 

如果重要,我使用Google Test作为我的单元测试框架。

由于

1 个答案:

答案 0 :(得分:0)

两种可能性:

  1. 不要直接在界面中使用boost::asio中的类型,如果类型足够复杂,请使用抽象:IMutableBufferSequenceIEndpoint等......
  2. 根据方法中使用的类型对整个界面进行模板化,但问题是你是否需要多态类型“界面”?