Если вы не пишете драйверы низкого уровня, ваш класс, несомненно, зависит от других классов, чтобы осуществлять фактическую связь. В этом случае я бы использовал внедрение зависимостей для предоставления этих классов или оберток вокруг них, если их нелегко высмеивать. В ваших тестах вы предоставляете фиктивную версию классов, от которых вы зависите (или обертки, если вы не можете насмехаться над реальными классами). Убедитесь, что правильные методы с правильными параметрами вызываются вашими методами на предоставленных вами макетах. Убедитесь, что у вас достаточно модульных тестов, чтобы убедиться, что вы охватили весь диапазон поведения из реальных зависимостей. Этого будет достаточно для ваших юнит-тестов.
Вам также понадобятся некоторые интеграционные тесты. К сожалению, самый простой способ сделать это, вероятно, - разработать полноценный макет-сервер для связи. Обратите внимание, что ваш фиктивный сервер должен реализовывать только интерфейс, а не реальный код на другом конце. Предоставьте несколько дополнительных методов, которые позволят вам настроить сервер для ваших интеграционных тестов так, чтобы происходило ожидаемое поведение с фиктивным сервером.