У меня есть простой, почти ценностный класс, как Person:
class Person
{
public:
Person(ThirdPartyClass *object);
virtual ~Person(void);
virtual std::string GetFullName() const;
virtual int GetAge() const;
virtual int GetNumberOfDaysTillBirthday() const;
};
Я использую стороннюю библиотеку, и ThirdPartyClass
должна иметь глобальную / статическую функцию с именем Destroy
(часть сторонней библиотеки), вызываемую для ее уничтожения. Эта Destroy
функция вызывается в деструкторе Person.
Теперь я пытаюсь выполнить юнит-тест моего класса Person, и мне нужен способ смоделировать / заглушить метод Destroy
. Я думаю, что мог бы написать класс-оболочку вокруг статической функции Destroy
, а затем использовать инъекцию зависимостей, чтобы внедрить эту оболочку в класс Person, но это выглядит излишним, просто чтобы вызвать эту единственную функцию в этом простом классе. Какой простой и простой способ сделать это? Или внедрение зависимости действительно лучший способ сделать это?
Обновление
В конечном итоге я решил создать класс, который обернул бы все глобальные функции сторонней библиотеки, а затем использовать внедрение зависимостей, чтобы передать этот класс в конструктор моего личного класса. Таким образом, я мог бы заглушить метод Destroy. Хотя класс person использует только одну функцию, другие функции библиотеки вызываются в других точках моего кода, и, поскольку мне нужно было проверить их, я столкнулся с той же проблемой.
Я создаю один экземпляр этого класса-обертки в коде моего основного приложения и внедряю его в случае необходимости. Я выбрал этот путь, потому что думаю, что он понятнее. Мне нравится решение Billy ONeal, и я думаю, что оно отвечает на мой вопрос, но я понял, что если я оставлю код на несколько месяцев и вернусь, мне понадобится больше времени, чтобы понять, что происходит по сравнению с внедрением зависимостей. Мне напомнили о дзен-афоризме «явное лучше, чем неявное». и я чувствую, что внедрение зависимостей делает происходящее немного более явным.