Каковы общие / общепринятые практики для иерархии классов модульного тестирования?
Я пытался найти разные вопросы, связанные с этой проблемой, но не смог найти исчерпывающего.
Предположим, что тестируется иерархия.
class Base
{
int base_internal() { return 10;}
public:
int virtual do_f() { return 0; }
int execute() {
return do_f()*base_internal();
}
};
class DerrivedA : public Base
{
int a_specefic() { return 4; }
public:
int virtual do_f() { return a_specefic(); }
};
class DerrivedB : public Base
{
int b_specefic() { return 8; }
public:
int virtual do_f() { return b_specefic(); }
};
Теперь, что касается инфраструктуры модульного тестирования, я думаю о двух стратегиях.
Стратегия 1. Имейте класс "тестер" для каждого типа, производный от соответствующего класса и проведите тестирование
class TestForBase : public Base {...};
class TestForDerrivedA : public DerrivedA {...};
class TestForDerrivedB : public DerrivedB {....};
Стратегия 2. Используйте «согласованную» версию шаблона проектирования посетителя (которая будет иметь один TestVisitor), затем измените каждый тестируемый класс с помощью метода accept () и проведите тестирование внутри visit () класса Тестер
class Base
{
void accept(Tester& t);
int base_internal();
public:
int virtual do_f();
int execute();
};
class Derrived : public Base
{
void accept(Tester& t);
int a_specefic();
public:
int virtual do_f();
};
struct Tester
{
void visit(Base* b) { ... };
void visit(Derrived* d) { ... } ;
};
Какие есть другие варианты?