c++ - 创建一个接口(interface)来模拟 C++ 对象

标签 c++ unit-testing boost interface

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

我的问题是你不能有一个虚拟模板函数,而 boost::asio 有一个高度模板化的用户界面。

如何创建一个接口(interface)来模拟使用模板的 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. 不要直接在接口(interface)中使用 boost::asio 中的类型,如果类型足够复杂,请使用抽象:IMutableBufferSequenceIEndpoint 等...
  2. 根据方法中使用的类型对整个接口(interface)进行模板化,但问题是您是否需要一个多态类型“接口(interface)”?

关于c++ - 创建一个接口(interface)来模拟 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843372/

相关文章:

c++ - 如何将websocket客户端连接到服务器?

c++ - C++11/14/17 中指向方法回调的指针?

C++/ENUM/类型名称/说明符

c++ - 为什么委托(delegate)或闭包通常被称为 true "object-oriented function pointers"?

java - Orika:从字符串映射到 SomeObjects 列表

javascript - 如何从 mocha/nyc 测试覆盖率(Node.js)中过滤掉某些模式?

c++ - 如何确定是否捕获了正则表达式的可选部分?

c++ - 如何通过哈希匹配boost multi_index_container中的nocase c字符串

Python C Api 将 PyObject * 传输到 c 数组

AngularJS + karma : reuse a mock service when unit testing directives or controllers