Но без виртуальной функции мы не можем высмеивать объекты для проведения модульного теста.
Это не совсем так. Как из Google Mock Cookbook вы на самом деле может издеваются без виртуальных функций:
Один способ сделать это состоит в templatize код, который необходимо использовать поток пакетов. Более конкретно, вы передадите вашему коду аргумент типа шаблона для типа потока пакетов. В процессе производства вы создадите экземпляр своего шаблона с помощью 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 ...
Ничего хорошего не выйдет из Google в плане поддержки DEV вещи. Их правила кодирования ужасны, и вы просто показали мне, как их ложная библиотека ужасна (о которой я всегда подозревал, но на самом деле никогда не смотрел). – SergeyA
@SergeyA Ну, у вас есть выбор динамического или статического полиморфизма. Это то, что происходит в реальном коде жизни. –
Я не отрицаю этого. Но единичная тестовая библиотека, которая требует полиморфизма (того или иного типа), где мой первоначальный дизайн не требует одного, - это просто плохая библиотека. – SergeyA