На мой взгляд, вы должны рассматривать эту библиотеку как внешнюю зависимость вашего кода (например, сторонней библиотеки) и кода соответственно.
Это означает, что, как упоминал Джон Скит, проектируйте свой код так, чтобы он был изолированным и тестируемым без внешней библиотеки. Разработайте пару интерфейсов (чисто виртуальных классов), которые фиксируют требуемые контракты, которые вы ожидаете от них выполнить, а также напишите пару интеграционных тестов, которые осуществляют связь между вашим кодом и этой библиотекой. В идеале, коммуникационная поверхность должна быть как можно меньше, возможно, только для пары адаптеров или мостов, которые реализуют ваши интерфейсы.
Тогда возникает проблема согласования "контракта", когда вы указываете части библиотеки, которые работают не так, как ожидалось, и (надеюсь) ждут исправления или соответственно адаптируют свой код. Вы можете обнаружить ошибки и семантические несоответствия таким образом, что может привести к параллельной эволюции вашего кода и библиотеки.
Если ваш код является единственным потребителем этой библиотеки, вы должны диктовать, что от нее ожидается, и она должна адаптироваться к вашим потребностям, а не наоборот. , Если они затем предоставляют ожидаемую услугу, тот факт, что они используют синглтоны или еще много чего, становится неактуальным.