2011-12-19 24 views
10

En las pruebas de integración (JDK 6) estoy intentando capturar todas las conexiones TCP salientes y simularlas. Parece que debería usar el método java.net.Socket#setSocketImplFactory(). Funciona bien en este momento, pero no puedo entender cómo puedo obtener acceso a la fábrica original, para crear una instancia de la clase original SocketImpl proporcionada por JDK. Lo necesito principalmente porque quiero dejar que algunas conexiones salgan libremente, sin burlarse. ¿Puede sugerir algunos manuales/directrices/instrucciones sobre este problema?¿Cómo burlarse de una conexión Socket saliente?

+0

Esta pregunta se relaciona: http://stackoverflow.com/questions/2083647/writing-a-java-net-socketimplfactory – yegor256

+0

También relacionado: http://stackoverflow.com/questions/2257901/mock-runtime-getruntime – Rich

Respuesta

0

De acuerdo con javadoc, debería poder usar SocketFactory#getDefault() para obtener el SocketFactory predeterminado para su entorno.

BTW: También puede ser que desee ver en este RFE/fallo que declara que SocketImplFactory es básicamente un callejón sin salida: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4245730

+0

Tienes razón, pero estoy hablando de 'SocketImplFactory', que genera instancias de la clase' SocketImpl'. La clase 'java.net.Socket' no tiene nada que ver con todo esto. – yegor256

0

Si examina el código fuente de la clase Socket, no existe un original de fábrica - la los constructores comprueban si factory es nulo, y si lo es, simplemente asignan impl para que sea un nuevo PlainSocketImpl().

+0

Por lo que yo entiendo, no existe el "código fuente de la clase Socket". Cada JDK tiene sus propias fuentes, que pueden diferir de la implementación a la implementación. – yegor256

+0

Quizás fue ingenuo pero asumí que estaba utilizando Oracle JDK 6, en cuyo caso hay fuentes específicas a las que hay que prestar atención: lo hice y lo usé para explicar que no hay una fábrica original para obtener(). Si puede hacerlo, estoy de acuerdo con @Peter Lawrey en que utilizar un servicio es el mejor método. Tuve que hacer lo mismo con Runtime.getRuntime(). http://stackoverflow.com/questions/2257901 – Rich

+0

Es una biblioteca de terceros dentro de mi aplicación, que usa Sockets. No puedo cambiarlo de todos modos. – yegor256

1

En lugar de burlarse de un zócalo, crearía un servicio Socket para que el Socket pueda hablar. Esto puede capturar todos los datos escritos y responder de la manera que desee. Se puede ejecutar en la misma prueba y posiblemente en el mismo hilo.

Cuestiones relacionadas