У меня есть кодовая база, в которой многие из реализуемых мною классов получены из классов, предоставляемых другими подразделениями моей компании. Работа с этими другими устройствами часто имеет рабочие отношения, как если бы они были сторонними поставщиками промежуточного программного обеспечения.
Я пытаюсь написать тестовый код без изменения этих базовых классов. Тем не менее, есть проблемы с созданием значимого теста
объекты из-за отсутствия интерфейсов:
//ACommonClass.h
#include "globalthermonuclearwar.h" //which contains deep #include dependencies...
#include "tictactoe.h" //...and need to exist at compile time to get into test...
class Something //which may or may not inherit from another class similar to this...
{
public:
virtual void fxn1(void); //which often calls into many other classes, similar to this
//...
int data1; //will be the only thing I can test against, but is often meaningless without fxn1 implemented
//...
};
Обычно я извлекаю интерфейс и работаю оттуда, но, поскольку это «Сторонние разработчики», я не могу зафиксировать эти изменения.
В настоящее время я создал отдельный файл, который содержит поддельные реализации для функций, которые определены в сторонних поставляемых заголовках базового класса на основе необходимости знать, как было описано в книге «Работа с устаревшим кодом» .
Мой план состоял в том, чтобы продолжать использовать эти определения и предоставлять альтернативные реализации тестов для каждого необходимого мне стороннего класса:
//SomethingRequiredImplementations.cpp
#include "ACommonClass.h"
void CGlobalThermoNuclearWar::Simulate(void) {}; // fake this and all other required functions...
// fake implementations for otherwise undefined functions in globalthermonuclearwar.h's #include files...
void Something::fxn1(void) { data1 = blah(); } //test specific functionality.
Но прежде чем я начал это делать, мне было интересно, пытался ли кто-нибудь предоставить реальные объекты на базе кода, подобной моей, что позволило бы создавать новые классы, специфичные для тестирования, для использования вместо реальных сторонних классов.
Обратите внимание, что все рассматриваемые кодовые базы написаны на C ++.