Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Традиционный подход говорит, что Ваш клиентский код должен использовать обертку, которая ответственна за инстанцирование COM-объекта. Эту обертку можно затем легко дразнить.
Поскольку у Вас есть части Вашего кода, инстанцирующего COM-объектов непосредственно, это действительно не соответствует. Если можно изменить тот код, Вы могли бы использовать шаблон "фабрика": они используют фабрику для создания COM-объекта. Можно дразнить фабрику для возврата альтернативных объектов.
Получают ли к объекту доступ через обертку, или через исходный COM-интерфейс ваше дело. Если Вы принимаете решение дразнить COM-интерфейс, не забудьте оснащать IUnknown:: QueryInterface в Вашей насмешке, таким образом, Вы знаете о насмешке всех интерфейсов, особенно если объект затем передается некоторому другому COM-объекту.
С другой стороны, проверьте метод CoTreateAsClass. Я никогда не использовал его, но это могло бы сделать то, в чем Вы нуждаетесь.
Это сводится 'к разработке для тестируемости'. Идеально, Вы не должны инстанцировать тех COM-объектов непосредственно, но должны получить доступ к ним через слой косвенности, которая может быть заменена фиктивным объектом.
Теперь, сам COM обеспечивает уровень абстракции, и Вы могли обеспечить фиктивный объект, который обеспечил замену для реальной, но я подозреваю, что это была бы боль для создания, и я сомневаюсь, получили ли Вы много справки от существующей платформы насмешки.
Я записал бы тонкий класс обертки вокруг Вашего стороннего COM-объекта, который имеет способность загрузить фиктивный объект, а не фактический COM-объект в ситуации с поблочным тестированием. Я обычно делаю это при наличии второго конструктора, что я называю передачу в фиктивном объекте. Нормальный конструктор просто загрузил бы COM-объект как нормальный.
Статья Википедии имеет хорошее введение в подчиненную Википедию artible