Использование функций MOCK в другом классе

Я пытаюсь изолировать свой класс, поэтому из-за обмена внешними бесплатными функциями с фиктивными реализациями я создал свой фиктивный класс для бесплатных функций, которые имели внешнюю зависимость в другом классе. Итак, как я буду вызывать эти фиктивные функции в своем классе?

Есть ли какая-нибудь реализация, которую вы можете мне предложить?

Я думаю о создании уникального указателя и вызове его, но я не совсем уверен в этом.

Какой подход я должен использовать для этого?

#include "source/common/main/dpc.hpp"
#include "source/common/main/dt.hpp"

#include <gmock/gmock.h>

namespace test {

namespace {

class dpcMock
{
public:
    MOCK_METHOD(bool, isVS, (const uint32_t id), ());

    MOCK_METHOD(St, gpType, (const uint32_t width), ());

    static dpcMock* activeMock;
};

} 
} 


#include "dpcMock.hpp"
#include "source/common/main/dpc.hpp"
#include <CppUTestExt/MockSupport.h>

test::dpcMock* test::dpcMock::activeMock = nullptr;

namespace common{
namespace main{
namespace {

bool isVS(const uint32_t id)
{
    if (::test::dpcMock::activeMock == nullptr)
    {
        return true;
    }
    return test::dpcMock::activeMock->isVS(id);
}

inline St gpType(const uint32_t width)
{
    if (::test::dpcMock::activeMock == nullptr)
    {
        return {};
    }
    return test::dpcMock::activeMock->gpType(width);
}

}
} 
} 

#include <memory>
#include <set>

#include "common/main/bm.hpp"
#include "common/main/ut/mocks/dpcMock.hpp"

namespace lucky{
namespace trap{
namespace main{

using namespace common::main;

class Dopy
{
public:
    void cDL(const sDL& sDLp);
    void cUL(const sUL& sULp);

    void csDL(const sDL& sDLp);
    void csUL(const sUL& sULp);

private:
    std::unique_ptr<sa> sa_fr;
    std::unique_ptr<bm> bm_fr;
};

} 
} 
}

person Hamlet Aliyev    schedule 03.12.2020    source источник


Ответы (1)


IMO с использованием unique_ptr - это способ, если вы хотите иметь одного владельца этого фиктивного класса, а владельцем является тестируемый класс. См. это сообщение, в котором показано, как использовать unique_ptr в таком контексте. Однако для простоты предлагаю начать с обычных ссылок - поначалу будет проще.

Что касается вашей реализации: вам нужен базовый класс для вашего макета и производственного класса (лучше всего будет чистый абстрактный класс без полей, только виртуальные методы), из которого происходят ваши рабочие и макетные классы (в прикрепленном посте это IBar). Этот интерфейс используется в вашем тестируемом классе (Foo в сообщении или Dopy в вашем коде). Затем вам нужен реальный класс (Bar в сообщении или dpc в вашем коде), предназначенный для производственного кода, и фиктивный класс (BarMock или dpcMock), который используется в тестах. Вам нужно использовать внедрение зависимостей, т.е. предоставить этот чистый абстрактный класс тестируемому классу - реальный для производства и макет для тестирования. В тестовой среде вы можете установить ожидания для своего макета и выполнить код в тестируемом классе.

На данный момент я не понимаю, как dcp и Dopy работают вместе, но я думаю, что вы должны каким-то образом предоставить dcp для Dopy (например, в ctor).

person Quarra    schedule 03.12.2020