我有一个 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 作为我的单元测试框架。
谢谢
最佳答案
两种可能性:
- 不要直接在接口(interface)中使用
boost::asio
中的类型,如果类型足够复杂,请使用抽象:IMutableBufferSequence
、IEndpoint
等... - 根据方法中使用的类型对整个接口(interface)进行模板化,但问题是您是否需要一个多态类型“接口(interface)”?
关于c++ - 创建一个接口(interface)来模拟 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843372/