#c #unit-testing #singleton
#c #модульное тестирование #одноэлементный
Вопрос:
У меня есть одноэлементный класс foo:
class foo
{
static foo* pointer;
foo();
public:
static foo* instance();
static void destroy();
}
foo::foo()
{
}
foo* foo::instance()
{
if (pointer == 0)
pointer = new foo();
return pointer;
}
void foo::destroy()
{
delete pointer;
pointer = 0;
}
Я пытаюсь выполнить модульное тестирование этого класса (у класса есть и другие методы, которые здесь показывать не обязательно).
Я создал MockClassfoo и унаследовал класс foo в MockClassfoo.
Я создал поддельный экземпляр MockClassfoo, как показано в моем тестовом классе:
class Test
{
auto aFake =(MockClassfoo *)MockClassfoo ::instance();
fooAccessor::set(aFake);
}
Однако в моем классе fooAccessor я хочу получить экземпляр foo .. удалить указатель и назначить ему мой макет экземпляра, что невозможно:
class fooAccessor
{
public:
static void set(foo * other)
{
foo::instance();
delete foo::pointer; //here i get error saying pointer is inaccessible
foo::pointer = other; //here i get error saying pointer is inaccessible
}
};
Я не хочу вносить какие-либо изменения в доступность указателя в классе ‘foo’. Я просто хочу получить экземпляр, удалить его и назначить ему свой макет экземпляра. Любые предложения о том, как это сделать, поскольку он говорит, что он недоступен?
Комментарии:
1. Вы не можете, и, честно говоря, вы не должны этого делать. Представьте, что ваш класс на самом деле создает правильный одноэлементный экземпляр и просто делает,
static foo * instance() { static foo obj; return amp;obj; }
Да .. и что теперь ? Короткая версия: ваша архитектура не позволит вам издеваться над этим экземпляром, используяfoo
as-is. Вот как вы его разработали.2. Ответ находится в другом замке. Поскольку вы не можете делать то, что хотите, нам нужно больше информации, чтобы помочь вам найти этот другой замок.
Ответ №1:
Если MockClassfoo унаследован от foo, сделайте foo не окончательным:
- создайте конструктор и статический указатель foo; * защищенный
- определите getInstance в своем макетном классе, который выделяет MockClassFoo вместо foo
Это должно сработать.
Несколько советов о вашем коде:
- Понтер в C должен быть инициализирован с использованием nullptr (или древнего NULL) и сравниваться с nullptr (или NULL). не с 0.
- Я предпочитаю добавлять явные частные: ключевые слова в начале класса
- Мне не нравится идея метода «уничтожить». Вместо этого используйте деструктор
Ответ №2:
Вам нужно создать fooAccessor
класс друзей внутри класса foo
. Таким образом, foo
предоставляет разрешение fooAccessor
на доступ к его закрытым членам.
Комментарии:
1. Я не могу этого сделать, поскольку в foo не требуется вносить никаких изменений.
2. Если вы можете загрузить минимально полный пример кода, мы можем помочь вам в решении проблемы.
3. Если вам не разрешено вносить какие-либо изменения
foo
, вы не сможете нарушить эту инкапсуляцию.