Замена исходного интерфейса на его макетную версию для тестирования
Я хотел бы реализовать несколько тестов для класса (скажем), который полагается на функциональность другого класса (скажем), содержащего указатель на закрытый член.
Вот минимальный и очень упрощенный пример имеющейся у меня структуры кода: Тестируемый класс
// A.cpp
#include "IB.h"
class A
{
public:
A() {
objectB = B::Instance();
}
void funcA1() {
// Calls B->funcB1() ...
}
void funcA2() {
// Calls B->funcB2() ...
}
private:
B* mObjectB;
}
который использует функциональность класса
// B.cpp
class B
{
public:
static B* Instance() {
// Returns instance of B
}
void funcB1() {
// Some complicated functionality
}
void funcB2() {
// Some complicated functionality
}
}
На самом деле они намного сложнее и состоят из отдельных файлов объявлений и определений, и оба наследуются от своих соответствующих интерфейсов (поэтому есть следующие файлы
IA.h
,
A.h
,
A.cpp
а также
IB.h
,
B.h
,
B.cpp
).
Как и в моей тестовой среде, я хотел бы заменить сложный материал, я создал его макет, который реализует функции с такими же именами, но гораздо проще:
// BMock.cpp
class BMock : public B
{
public:
static BMock* Instance() {
// Returns instance of BMock
}
void funcB1() {
// Simulates complicated functionality of B::funcB1 with some simple functionality
}
void funcB2() {
// Simulates complicated functionality of B::funcB2 with some simple functionality
}
}
В основном тестовом файле я тестирую экземпляр
A
класс, вызывая его методы:
// MainTestFile.cpp
#include "A.h"
A objectA = A();
objectA.funcA1();
objectA.funcA2();
Итак, основная проблема, которую я не совсем понимаю, как решить, заключается в том, что при вызове
objectA.funcA1()
в
MainTestFile.cpp
, он будет использовать функции исходного класса (поскольку он включает заголовок соответствующего интерфейса).
Однако моя цель - как-то заменить исходные функции
B
с поддельными функциями из
BMock
.
Я использую структуру Boost.Test для своих тестов, поэтому особенно приветствуются решения, использующие именно эту библиотеку. Но я, конечно, также открыт для других возможных решений. Заранее спасибо!