2012-03-23 88 views
1

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

我的问题是,你不能有一个虚拟模板功能和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作为我的单元测试框架。

感谢

回答

0

两种可能性:

  1. 不要在你的界面直接使用从boost::asio类型,使用抽象如果类型足够复杂的:IMutableBufferSequenceIEndpoint等...
  2. 模板化你的整个接口与方法中使用的类型有关,但问题是你需要一个多态的类型“接口”吗?
相关问题