虚拟功能在运行时有成本。但是没有虚函数,我们就不能模拟对象进行单元测试。
最佳做法是什么?
谢谢!
答案 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 ...