Модульное тестирование деструкторов?

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

jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
TableColumnModel colModel=jTable1.getColumnModel();
colModel.getColumn(1).setPreferredWidth(25);    
colModel.getColumn(2).setPreferredWidth(400);
14
задан Jason Baker 23 November 2008 в 00:54
поделиться

6 ответов

Может быть что-то, чтобы быть сказанным для внедрения зависимости. Вместо того, чтобы создать объект (в этом случае интервал, но в неизобретенном случае более вероятно пользовательский тип) в его конструкторе, объект передается в качестве параметра конструктору. Если объект создается позже, то фабрика передается конструктору X.

Затем, когда Вы - поблочное тестирование, Вы передаете в фиктивном объекте (или ложная фабрика, которая создает фиктивные объекты), и деструктор записывает то, что это назвали. Тест перестал работать, если это не.

Конечно, Вы не можете дразнить (или иначе заменить), встроенный тип, так в данном случае это бесполезно, но если Вы определяете объект/фабрику с интерфейсом затем, Вы можете.

Проверка утечки памяти в модульных тестах может часто делаться в более высоком уровне, как сказали другие. Но это только проверяет, что деструктор назвали, не оказывается, что правильный деструктор назвали. Таким образом, это не было бы, например, ловить недостающее "виртуальное" объявление по деструктору типа x участника (снова, не релевантный, если это - просто интервал).

9
ответ дан 1 December 2019 в 03:44
поделиться

Я думаю, что Ваша проблема состоит в том, что Ваш текущий пример не является тестируемым. Так как Вы хотите знать если x был удален, действительно необходимо смочь заменить x с насмешкой. Это - вероятно, немного OTT для интервала, но я предполагаю в Вашем реальном примере, у Вас есть некоторый другой класс. Сделать это тестируемым, X конструктор должен попросить объект, реализовав int интерфейс:

template<class T>
class X
{
  T *x;
  public:
  X(T* inx)
    : x(inx)
  {
  }

  // etc
};

Теперь становится просто дразнить в значении за x, и насмешка может обработать проверку корректное разрушение.

Не уделите внимания людям, которые говорят, что необходимо повредить инкапсуляцию или обращение к ужасным взломам для приведения к тестируемому коду. В то время как это верно, что протестированный код лучше, чем непротестированный код, тестируемый код является лучшим из всех, и это всегда приводит к более четкому коду с меньшим количеством взломов и более низкой связи.

7
ответ дан 1 December 2019 в 03:44
поделиться

Я склонен идти с "Каким-либо образом необходимым" подходом к тестированию. Если этому нужен тест, я готов пропустить абстракции, инкапсуляцию повреждения и взлом..., потому что протестированный код лучше, чем симпатичный код. Я буду часто называть методы, которые повреждают это что-то как VaildateForTesting или OverrideForTesting, чтобы прояснить, что нарушение инкапсуляции предназначено для тестирования только.

Я не знаю ни о каком другом способе сделать это в C++, чем наличие вызова деструктора в одиночный элемент для регистрации этого, это было уничтожено. Я придумал метод для того, чтобы сделать что-то подобное этому в C# с помощью слабой ссылки (я не нарушаю инкапсуляцию или абстракции с этим подходом). Я не являюсь достаточно творческим для предложения аналогии с C++, но ВЫ могли бы быть. Если это помогает, большой, в противном случае извините.

http://houseofbilz.com/archive/2008/11/11/writing-tests-to-catch-memory-leaks-in-.net.aspx

2
ответ дан 1 December 2019 в 03:44
поделиться

В примере определите и оснастите свое собственное глобальное новое и удалите.

Для предотвращения #ifdefs я имею, заводят тестовых друзей классов. Можно установить/сохранить/получить состояние как требуется для проверки результатов вызова.

1
ответ дан 1 December 2019 в 03:44
поделиться

Некоторые компиляторы перезапишут удаленную память с известным шаблоном в режиме отладки, чтобы помочь обнаружить доступ к висячим указателям. Я знаю, что Visual C++ раньше использовал 0xDD, но я не использовал его в некоторое время.

В Вашем тестовом сценарии можно сохранить копию x, позволить ему выйти из объема и удостовериться что *x == 0xDDDDDDDD:

void testDestructor()
{
    int *my_x;
    {
        X object;
        my_x = object.getX();
    }
    CPPUNIT_ASSERT( *my_x == 0xDDDDDDDD );
}
0
ответ дан 1 December 2019 в 03:44
поделиться

Не предложение агностика платформы, но в прошлом я выполнил вызовы в функции проверки "кучи" CRT во время поблочного тестирования, чтобы проверить, что больше нет памяти, выделенной в конце теста (или возможно полный набор тестов), чем запуск. Вы могли бы также смочь сделать что-то похожее с инструментарием своей платформы, проверить количества дескриптора, и т.д.

0
ответ дан 1 December 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: