Как делают Вас код модульного теста, который взаимодействует с и инстанцирует сторонних COM-объектов?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

6
задан Oliver Giesen 16 September 2008 в 08:53
поделиться

3 ответа

Традиционный подход говорит, что Ваш клиентский код должен использовать обертку, которая ответственна за инстанцирование COM-объекта. Эту обертку можно затем легко дразнить.

Поскольку у Вас есть части Вашего кода, инстанцирующего COM-объектов непосредственно, это действительно не соответствует. Если можно изменить тот код, Вы могли бы использовать шаблон "фабрика": они используют фабрику для создания COM-объекта. Можно дразнить фабрику для возврата альтернативных объектов.

Получают ли к объекту доступ через обертку, или через исходный COM-интерфейс ваше дело. Если Вы принимаете решение дразнить COM-интерфейс, не забудьте оснащать IUnknown:: QueryInterface в Вашей насмешке, таким образом, Вы знаете о насмешке всех интерфейсов, особенно если объект затем передается некоторому другому COM-объекту.

С другой стороны, проверьте метод CoTreateAsClass. Я никогда не использовал его, но это могло бы сделать то, в чем Вы нуждаетесь.

6
ответ дан 9 December 2019 в 22:42
поделиться

Это сводится 'к разработке для тестируемости'. Идеально, Вы не должны инстанцировать тех COM-объектов непосредственно, но должны получить доступ к ним через слой косвенности, которая может быть заменена фиктивным объектом.

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

3
ответ дан 9 December 2019 в 22:42
поделиться

Я записал бы тонкий класс обертки вокруг Вашего стороннего COM-объекта, который имеет способность загрузить фиктивный объект, а не фактический COM-объект в ситуации с поблочным тестированием. Я обычно делаю это при наличии второго конструктора, что я называю передачу в фиктивном объекте. Нормальный конструктор просто загрузил бы COM-объект как нормальный.

Статья Википедии имеет хорошее введение в подчиненную Википедию artible

2
ответ дан 9 December 2019 в 22:42
поделиться
Другие вопросы по тегам:

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