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