为了模拟对象,我们应该声明所有成员函数虚拟(C ++)吗?

时间:2016-03-17 18:35:34

标签: c++ performance googletest virtual-functions gmock

虚拟功能在运行时有成本。但是没有虚函数,我们就不能模拟对象进行单元测试。

最佳做法是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

但是没有虚函数,我们就不能模拟对象进行单元测试。

这不完全正确。从Google Mock Cookbook开始,你实际上可以模拟非虚函数:

  

实现此目的的一种方法是模拟需要使用数据包流的代码。更具体地说,您将为代码提供数据包流类型的模板类型参数。在生产中,您将使用ConcretePacketStream作为类型参数来实例化模板。在测试中,您将使用MockPacketStream实例化相同的模板。例如,您可以写:

template <class PacketStream>
void CreateConnection(PacketStream* stream) { ... }

template <class PacketStream>
class PacketReader {
 public:
  void ReadPackets(PacketStream* stream, size_t packet_num);
 };
     

然后,您可以在生产代码中使用CreateConnection<ConcretePacketStream>()PacketReader<ConcretePacketStream>,并在测试中使用CreateConnection<MockPacketStream>()PacketReader<MockPacketStream>

 MockPacketStream mock_stream;
 EXPECT_CALL(mock_stream, ...)...;
 ... set more expectations on mock_stream ...
  PacketReader<MockPacketStream> reader(&mock_stream);
 ... exercise reader ...