【问题标题】:Creating an interface to mock for C++ objects为 C++ 对象创建一个模拟接口
【发布时间】:2012-03-23 17:02:17
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: c++ unit-testing boost interface


    【解决方案1】:

    两种可能:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      相关资源
      最近更新 更多