2016-03-17 5 views
0

Виртуальные функции имеют затраты во время выполнения. Но без виртуальной функции мы не можем издеваться над объектами для модульного теста.Чтобы издеваться над объектами, объявим ли все функции-члены виртуальными (C++)?

Какова наилучшая практика?

Спасибо!

ответ

1

Но без виртуальной функции мы не можем высмеивать объекты для проведения модульного теста.

Это не совсем так. Как из 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 ... 
+0

Ничего хорошего не выйдет из Google в плане поддержки DEV вещи. Их правила кодирования ужасны, и вы просто показали мне, как их ложная библиотека ужасна (о которой я всегда подозревал, но на самом деле никогда не смотрел). – SergeyA

+0

@SergeyA Ну, у вас есть выбор динамического или статического полиморфизма. Это то, что происходит в реальном коде жизни. –

+0

Я не отрицаю этого. Но единичная тестовая библиотека, которая требует полиморфизма (того или иного типа), где мой первоначальный дизайн не требует одного, - это просто плохая библиотека. – SergeyA