Замена исходного интерфейса на его макетную версию для тестирования

Я хотел бы реализовать несколько тестов для класса (скажем), который полагается на функциональность другого класса (скажем), содержащего указатель на закрытый член.

Вот минимальный и очень упрощенный пример имеющейся у меня структуры кода: Тестируемый класс

      // 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 для своих тестов, поэтому особенно приветствуются решения, использующие именно эту библиотеку. Но я, конечно, также открыт для других возможных решений. Заранее спасибо!

0 ответов

Другие вопросы по тегам