Как издеваться над исходящим соединением Socket?

В тестах интеграции (JDK 6) я пытаюсь поймать все исходящие TCP-соединения и издеваться над ними. Похоже, я должен использовать метод java.net.Socket#setSocketImplFactory(). Пока работает отлично, но я не могу понять, как получить доступ к оригинальному factory, чтобы создать экземпляр исходного класса SocketImpl, предоставленного JDK. Мне нужно это в основном потому, что я хочу, чтобы некоторые соединения выходили свободно, без насмешек. Можете ли вы предложить некоторые руководства/рекомендации/инструкции по этой проблеме?

Ответ 1

Вместо того, чтобы издеваться над Socket, я бы создал службу Socket для Socket, с которой можно было бы поговорить. Это может захватывать все записанные данные и отвечать любым способом. Его можно запустить в том же тесте и, возможно, в том же потоке.

Ответ 2

В соответствии с javadoc вы можете использовать SocketFactory # getDefault(), чтобы получить стандартную SocketFactory для вашей среды.

Кстати: вы также можете посмотреть на эту RFE/bug, которая заявляет, что SocketImplFactory в основном тупик: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4245730

Ответ 3

Глядя на исходный код класса Socket, нет оригинала factory - конструкторы проверяют, имеет ли значение factory значение null, и если это так, они просто назначают impl новым PlainSocketImpl().